/// A data provider that loads data for a specific [`DataKey`]. pubtrait DataProvider<M> where
M: KeyedDataMarker,
{ /// Query the provider for data, returning the result. /// /// Returns [`Ok`] if the request successfully loaded data. If data failed to load, returns an /// Error with more information. fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError>;
}
impl<'a, M, P> DataProvider<M> for &'a P where
M: KeyedDataMarker,
P: DataProvider<M> + ?Sized,
{ #[inline] fn load(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(*self).load(req)
}
}
/// A data provider that loads data for a specific data type. /// /// Unlike [`DataProvider`], there may be multiple keys corresponding to the same data type. /// This is often the case when returning `dyn` trait objects such as [`AnyMarker`]. /// /// [`AnyMarker`]: crate::any::AnyMarker pubtrait DynamicDataProvider<M> where
M: DataMarker,
{ /// Query the provider for data, returning the result. /// /// Returns [`Ok`] if the request successfully loaded data. If data failed to load, returns an /// Error with more information. fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError>;
}
impl<'a, M, P> DynamicDataProvider<M> for &'a P where
M: DataMarker,
P: DynamicDataProvider<M> + ?Sized,
{ #[inline] fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(*self).load_data(key, req)
}
}
/// A data provider that loads data for a specific data type. /// /// Unlike [`DataProvider`], the provider is bound to a specific key ahead of time. /// /// This crate provides [`DataProviderWithKey`] which implements this trait on a single provider /// with a single key. However, this trait can also be implemented on providers that fork between /// multiple keys that all return the same data type. For example, it can abstract over many /// calendar systems in the datetime formatter. /// /// [`AnyMarker`]: crate::any::AnyMarker pubtrait BoundDataProvider<M> where
M: DataMarker,
{ /// Query the provider for data, returning the result. /// /// Returns [`Ok`] if the request successfully loaded data. If data failed to load, returns an /// Error with more information. fn load_bound(&self, req: DataRequest) -> Result<DataResponse<M>, DataError>; /// Returns the [`DataKey`] that this provider uses for loading data. fn bound_key(&self) -> DataKey;
}
impl<'a, M, P> BoundDataProvider<M> for &'a P where
M: DataMarker,
P: BoundDataProvider<M> + ?Sized,
{ #[inline] fn load_bound(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> {
(*self).load_bound(req)
} #[inline] fn bound_key(&self) -> DataKey {
(*self).bound_key()
}
}
usesuper::*; usecrate::hello_world::*; usecrate::prelude::*; use alloc::borrow::Cow; use alloc::string::String; use core::fmt::Debug; use serde::{Deserialize, Serialize};
// This tests DataProvider borrow semantics with a dummy data provider based on a // JSON string. It also exercises most of the data provider code paths.
/// Key for HelloAlt, used for testing mismatched types const HELLO_ALT_KEY: DataKey = crate::data_key!("core/helloalt@1");
/// A data struct serialization-compatible with HelloWorldV1 used for testing mismatched types #[derive(
Serialize, Deserialize, Debug, Clone, Default, PartialEq, yoke::Yokeable, zerofrom::ZeroFrom,
)] struct HelloAlt { #[zerofrom(clone)]
message: String,
}
/// Marker type for [`HelloAlt`]. struct HelloAltMarker {}
impl DataMarker for HelloAltMarker { type Yokeable = HelloAlt;
}
#[test] fn test_provider2() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); let hello_data = get_payload_v1(&provider).unwrap();
assert!(matches!(
hello_data.get(),
HelloWorldV1 {
message: Cow::Borrowed(_),
}
));
}
#[test] fn test_provider2_dyn_erased() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); let hello_data = get_payload_v1(&provider.as_any_provider().as_downcasting()).unwrap();
assert!(matches!(
hello_data.get(),
HelloWorldV1 {
message: Cow::Borrowed(_),
}
));
}
#[test] fn test_provider2_dyn_erased_alt() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); let hello_data = get_payload_alt(&provider.as_any_provider().as_downcasting()).unwrap();
assert!(matches!(hello_data.get(), HelloAlt { .. }));
}
#[test] fn test_provider2_dyn_generic() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); let hello_data =
get_payload_v1(&provider as &dyn DataProvider<HelloWorldV1Marker>).unwrap();
assert!(matches!(
hello_data.get(),
HelloWorldV1 {
message: Cow::Borrowed(_),
}
));
}
#[test] fn test_provider2_dyn_generic_alt() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); let hello_data = get_payload_alt(&provider as &dyn DataProvider<HelloAltMarker>).unwrap();
assert!(matches!(hello_data.get(), HelloAlt { .. }));
}
#[test] fn test_mismatched_types() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse); // Request is for v2, but type argument is for v1 let response: Result<DataResponse<HelloWorldV1Marker>, DataError> = AnyProvider::load_any(
&provider.as_any_provider(),
HELLO_ALT_KEY,
Default::default(),
)
.unwrap()
.downcast();
assert!(matches!(
response,
Err(DataError {
kind: DataErrorKind::MismatchedType(_),
..
})
));
}
fn check_v1_v2<P>(d: &P) where
P: DataProvider<HelloWorldV1Marker> + DataProvider<HelloAltMarker> + ?Sized,
{ let v1: DataPayload<HelloWorldV1Marker> =
d.load(Default::default()).unwrap().take_payload().unwrap(); let v2: DataPayload<HelloAltMarker> =
d.load(Default::default()).unwrap().take_payload().unwrap(); if v1.get().message == v2.get().message {
panic!()
}
}
#[test] fn test_v1_v2_generic() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse);
check_v1_v2(&provider);
}
#[test] fn test_v1_v2_dyn_erased() { let warehouse = get_warehouse(DATA); let provider = DataProvider2::from(warehouse);
check_v1_v2(&provider.as_any_provider().as_downcasting());
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.24 Sekunden
(vorverarbeitet am 2026-06-23)
¤
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.