use crate::bin_uniset::BinaryPropertyUnicodeSetDataProvider;
use crate::enum_uniset::EnumeratedPropertyUnicodeSetDataProvider;
use crate::uprops_helpers::get_last_component_no_version;
use icu_properties::provider::UnicodePropertyV1Marker;
use icu_provider::iter::IterableProvider;
use icu_provider::prelude::*;
use std::path::Path;
pub struct PropertiesDataProvider {
binary: BinaryPropertyUnicodeSetDataProvider,
enumerated: EnumeratedPropertyUnicodeSetDataProvider,
}
impl PropertiesDataProvider {
pub fn try_new(root_dir: &Path) -> eyre::Result<Self> {
let binary = BinaryPropertyUnicodeSetDataProvider::try_new(root_dir)?;
let enumerated = EnumeratedPropertyUnicodeSetDataProvider::try_new(root_dir)?;
Ok(Self { binary, enumerated })
}
}
impl DataProvider<UnicodePropertyV1Marker> for PropertiesDataProvider {
fn load_payload(
&self,
req: &DataRequest,
) -> Result<DataResponse<UnicodePropertyV1Marker>, DataError> {
if get_last_component_no_version(&req.resource_path.key).contains('=') {
self.enumerated.load_payload(req)
} else {
self.binary.load_payload(req)
}
}
}
icu_provider::impl_dyn_provider!(PropertiesDataProvider, {
_ => UnicodePropertyV1Marker,
}, SERDE_SE);
impl IterableProvider for PropertiesDataProvider {
fn supported_options_for_key(
&self,
_resc_key: &ResourceKey,
) -> Result<Box<dyn Iterator<Item = ResourceOptions>>, DataError> {
let list: Vec<ResourceOptions> = vec![ResourceOptions::default()];
Ok(Box::new(list.into_iter()))
}
}