//! Utilities for using trait objects with `DataPayload`.
/// Trait to allow conversion from `DataPayload<T>` to `DataPayload<S>`. /// /// This trait can be manually implemented in order to enable [`impl_dynamic_data_provider`]. pubtrait UpcastDataPayload<M> where
M: crate::DynamicDataMarker, Self: Sized + crate::DynamicDataMarker,
{ /// Upcast a `DataPayload<T>` to a `DataPayload<S>` where `T` implements trait `S`. fn upcast(other: crate::DataPayload<M>) -> crate::DataPayload<Self>;
}
/// Implements [`UpcastDataPayload`] from several data markers to a single data marker /// that all share the same [`DynamicDataMarker::DataStruct`]. /// /// # Examples /// /// ``` /// use icu_provider::prelude::*; /// use std::borrow::Cow; /// /// struct FooV1; /// impl DynamicDataMarker for FooV1 { /// type DataStruct = Foo<'static>; /// } /// icu_provider::data_marker!(BarV1, Foo<'static>); /// icu_provider::data_marker!(BazV1, Foo<'static>); /// /// #[derive(yoke::Yokeable)] /// pub struct Foo<'data> { /// message: Cow<'data, str>, /// }; /// /// icu_provider::data_struct!(Foo<'_>); /// /// icu_provider::dynutil::impl_casting_upcast!(FooV1, [BarV1, BazV1,]); /// ``` /// /// [`DynamicDataMarker::DataStruct`]: crate::DynamicDataMarker::DataStruct #[macro_export] #[doc(hidden)] // macro
macro_rules! __impl_casting_upcast {
($dyn_m:path, [ $($struct_m:ident),+, ]) => {
$( impl $crate::dynutil::UpcastDataPayload<$struct_m> for $dyn_m { fn upcast(other: $crate::DataPayload<$struct_m>) -> $crate::DataPayload<$dyn_m> {
other.cast()
}
}
)+
}
} #[doc(inline)] pubuse __impl_casting_upcast as impl_casting_upcast;
/// Implements [`DynamicDataProvider`] for a marker type `S` on a type that already implements /// [`DynamicDataProvider`] or [`DataProvider`] for one or more `M`, where `M` is a concrete type /// that is convertible to `S` via [`UpcastDataPayload`]. /// /// ## Wrapping DataProvider /// /// If your type implements [`DataProvider`], pass a list of markers as the second argument. /// This results in a `DynamicDataProvider` that delegates to a specific marker if the marker /// matches or else returns [`DataErrorKind::MarkerNotFound`]. /// /// [`DynamicDataProvider`]: crate::DynamicDataProvider /// [`DataProvider`]: crate::DataProvider /// [`DataErrorKind::MarkerNotFound`]: (crate::DataErrorKind::MarkerNotFound) /// [`SerializeMarker`]: (crate::buf::SerializeMarker) #[doc(hidden)] // macro #[macro_export]
macro_rules! __impl_dynamic_data_provider { // allow passing in multiple things to do and get dispatched
($provider:ty, $arms:tt, $one:path, $($rest:path),+) => {
$crate::dynutil::impl_dynamic_data_provider!(
$provider,
$arms,
$one
);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.