pub struct FilterDataProvider<D, F>{
pub inner: D,
pub predicate: F,
pub filter_name: &'static str,
}Expand description
A data provider that selectively filters out data requests.
Data requests that are rejected by the filter will return a DataError with kind
Filtered, and they will not be returned
by IterableDynamicDataProvider::iter_ids_for_marker.
Although this struct can be created directly, the traits in this module provide helper functions for common filtering patterns.
Fields§
§inner: DThe data provider to which we delegate requests.
predicate: FThe predicate function. A return value of true indicates that the request should
proceed as normal; a return value of false will reject the request.
filter_name: &'static strA name for this filter, used in error messages.
Implementations§
Source§impl<D> FilterDataProvider<D, fn(DataIdentifierBorrowed<'_>) -> bool>
impl<D> FilterDataProvider<D, fn(DataIdentifierBorrowed<'_>) -> bool>
Sourcepub fn new(provider: D, filter_name: &'static str) -> Self
pub fn new(provider: D, filter_name: &'static str) -> Self
Creates a FilterDataProvider that does not do any filtering.
Filters can be added using Self::with_filter.
Source§impl<D, F> FilterDataProvider<D, F>
impl<D, F> FilterDataProvider<D, F>
Sourcepub fn with_filter<'a>(
self,
predicate: impl Fn(DataIdentifierBorrowed<'_>) -> bool + Sync + 'a,
) -> FilterDataProvider<D, Box<dyn Fn(DataIdentifierBorrowed<'_>) -> bool + Sync + 'a>>where
F: 'a,
pub fn with_filter<'a>(
self,
predicate: impl Fn(DataIdentifierBorrowed<'_>) -> bool + Sync + 'a,
) -> FilterDataProvider<D, Box<dyn Fn(DataIdentifierBorrowed<'_>) -> bool + Sync + 'a>>where
F: 'a,
Filter out data requests with certain langids according to the predicate function. The
predicate should return true to allow a langid and false to reject a langid.
§Examples
use icu_locale::LanguageIdentifier;
use icu_locale::{langid, subtags::language};
use icu_provider::hello_world::*;
use icu_provider::prelude::*;
use icu_provider_adapters::filter::FilterDataProvider;
let provider =
FilterDataProvider::new(HelloWorldProvider, "Demo no-English filter")
.with_filter(|id| id.locale.language != language!("en"));
// German requests should succeed:
let de = DataIdentifierCow::from_locale(langid!("de").into());
let response: Result<DataResponse<HelloWorldV1>, _> =
provider.load(DataRequest {
id: de.as_borrowed(),
..Default::default()
});
assert!(response.is_ok());
// English requests should fail:
let en = DataIdentifierCow::from_locale(langid!("en-US").into());
let response: Result<DataResponse<HelloWorldV1>, _> =
provider.load(DataRequest {
id: en.as_borrowed(),
..Default::default()
});
let response: Result<DataResponse<HelloWorldV1>, _> =
provider.load(DataRequest {
id: en.as_borrowed(),
..Default::default()
});
assert_eq!(
response.unwrap_err().kind,
DataErrorKind::IdentifierNotFound,
);
// English should not appear in the iterator result:
let available_ids = provider
.iter_ids()
.expect("Should successfully make an iterator of supported locales");
assert!(available_ids
.contains(&DataIdentifierCow::from_locale(langid!("de").into())));
assert!(!available_ids
.contains(&DataIdentifierCow::from_locale(langid!("en").into())));Source§impl<D, F> FilterDataProvider<D, F>
impl<D, F> FilterDataProvider<D, F>
fn check( &self, marker: DataMarkerInfo, req: DataRequest<'_>, ) -> Result<(), DataError>
Trait Implementations§
Source§impl<D, F, M> DataProvider<M> for FilterDataProvider<D, F>
impl<D, F, M> DataProvider<M> for FilterDataProvider<D, F>
Source§fn load(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>
fn load(&self, req: DataRequest<'_>) -> Result<DataResponse<M>, DataError>
Source§impl<D: Debug, F> Debug for FilterDataProvider<D, F>
impl<D: Debug, F> Debug for FilterDataProvider<D, F>
Source§impl<D, F, M> DryDataProvider<M> for FilterDataProvider<D, F>
impl<D, F, M> DryDataProvider<M> for FilterDataProvider<D, F>
Source§fn dry_load(
&self,
req: DataRequest<'_>,
) -> Result<DataResponseMetadata, DataError>
fn dry_load( &self, req: DataRequest<'_>, ) -> Result<DataResponseMetadata, DataError>
Source§impl<D, F, M> DynamicDataProvider<M> for FilterDataProvider<D, F>
impl<D, F, M> DynamicDataProvider<M> for FilterDataProvider<D, F>
Source§fn load_data(
&self,
marker: DataMarkerInfo,
req: DataRequest<'_>,
) -> Result<DataResponse<M>, DataError>
fn load_data( &self, marker: DataMarkerInfo, req: DataRequest<'_>, ) -> Result<DataResponse<M>, DataError>
Source§impl<D, F, M> DynamicDryDataProvider<M> for FilterDataProvider<D, F>where
F: Fn(DataIdentifierBorrowed<'_>) -> bool,
M: DynamicDataMarker,
D: DynamicDryDataProvider<M>,
impl<D, F, M> DynamicDryDataProvider<M> for FilterDataProvider<D, F>where
F: Fn(DataIdentifierBorrowed<'_>) -> bool,
M: DynamicDataMarker,
D: DynamicDryDataProvider<M>,
Source§fn dry_load_data(
&self,
marker: DataMarkerInfo,
req: DataRequest<'_>,
) -> Result<DataResponseMetadata, DataError>
fn dry_load_data( &self, marker: DataMarkerInfo, req: DataRequest<'_>, ) -> Result<DataResponseMetadata, DataError>
Source§impl<M, D, F> IterableDataProvider<M> for FilterDataProvider<D, F>
impl<M, D, F> IterableDataProvider<M> for FilterDataProvider<D, F>
Source§fn iter_ids(&self) -> Result<BTreeSet<DataIdentifierCow<'_>>, DataError>
fn iter_ids(&self) -> Result<BTreeSet<DataIdentifierCow<'_>>, DataError>
DataIdentifierCow.Source§impl<M, D, F> IterableDynamicDataProvider<M> for FilterDataProvider<D, F>where
M: DynamicDataMarker,
F: Fn(DataIdentifierBorrowed<'_>) -> bool,
D: IterableDynamicDataProvider<M>,
impl<M, D, F> IterableDynamicDataProvider<M> for FilterDataProvider<D, F>where
M: DynamicDataMarker,
F: Fn(DataIdentifierBorrowed<'_>) -> bool,
D: IterableDynamicDataProvider<M>,
Source§fn iter_ids_for_marker(
&self,
marker: DataMarkerInfo,
) -> Result<BTreeSet<DataIdentifierCow<'_>>, DataError>
fn iter_ids_for_marker( &self, marker: DataMarkerInfo, ) -> Result<BTreeSet<DataIdentifierCow<'_>>, DataError>
DataMarkerInfo, returns a set of DataIdentifierCow.