diff --git a/Cargo.lock b/Cargo.lock index 74db0ea4d7f..2dfb7f484a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -921,9 +921,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elsa" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714f766f3556b44e7e4776ad133fcc3445a489517c25c704ace411bb14790194" +checksum = "d98e71ae4df57d214182a2e5cb90230c0192c6ddfcaa05c36453d46a54713e10" dependencies = [ "stable_deref_trait", ] diff --git a/provider/core/src/datagen/iter.rs b/provider/core/src/datagen/iter.rs index 6175d89c6f4..ad6bc1b219d 100644 --- a/provider/core/src/datagen/iter.rs +++ b/provider/core/src/datagen/iter.rs @@ -22,6 +22,10 @@ pub trait IterableDynamicDataProvider: DynamicDataProvider { pub trait IterableDataProvider: DataProvider { /// Returns a list of [`DataLocale`]. fn supported_locales(&self) -> Result, DataError>; + /// Returns whether a [`DataLocale`] is in the supported locales list. + fn supports_locale(&self, locale: &DataLocale) -> Result { + self.supported_locales().map(|v| v.contains(locale)) + } } impl IterableDynamicDataProvider for Box

diff --git a/provider/datagen/Cargo.toml b/provider/datagen/Cargo.toml index 9599311bfd5..5f1177232cd 100644 --- a/provider/datagen/Cargo.toml +++ b/provider/datagen/Cargo.toml @@ -73,7 +73,7 @@ proc-macro2 = {version = "1", optional = true } # Other external dependencies displaydoc = { version = "0.2.3", default-features = false } -elsa = "1.9" +elsa = "1.10" itertools = "0.10" log = "0.4" memchr = "2.5.0" diff --git a/provider/datagen/src/provider.rs b/provider/datagen/src/provider.rs index ad9a2fbcd5a..fdfc914ba5e 100644 --- a/provider/datagen/src/provider.rs +++ b/provider/datagen/src/provider.rs @@ -7,7 +7,10 @@ use crate::source::*; use crate::transform::cldr::source::CldrCache; use crate::{CollationHanDatabase, CoverageLevel}; +use elsa::sync::FrozenMap; +use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; +use std::collections::HashSet; use std::fmt::Debug; use std::path::PathBuf; use std::sync::Arc; @@ -78,6 +81,7 @@ impl DatagenProvider { icuexport_dictionary_fallback: None, #[cfg(feature = "legacy_api")] collations: Default::default(), + supported_locales_cache: Default::default(), }, } } @@ -258,6 +262,24 @@ impl DatagenProvider { ) -> Result, DataError> { self.cldr()?.locales(levels) } + + pub(crate) fn supported_locales_set(&self) -> Result<&HashSet, DataError> + where + M: KeyedDataMarker, + Self: IterableDataProviderInternal, + { + #[allow(deprecated)] // SourceData + self.source + .supported_locales_cache + .insert_with(M::KEY, || { + Box::new( + self.supported_locales_impl() + .map(|v| v.into_iter().collect()), + ) + }) + .as_ref() + .map_err(|e| *e) + } } /// Specifies the trie type to use. @@ -306,6 +328,9 @@ pub struct SourceData { pub(crate) icuexport_dictionary_fallback: Option>, #[cfg(feature = "legacy_api")] pub(crate) collations: Vec, + #[allow(clippy::type_complexity)] // not as complex as it appears + pub(crate) supported_locales_cache: + Arc, DataError>>>>, } #[cfg(feature = "legacy_api")] @@ -485,3 +510,21 @@ impl SourceData { .locales(levels.iter().copied()) } } + +pub(crate) trait IterableDataProviderInternal: DataProvider { + fn supported_locales_impl(&self) -> Result, DataError>; +} + +impl IterableDataProvider for DatagenProvider +where + DatagenProvider: IterableDataProviderInternal, +{ + fn supported_locales(&self) -> Result, DataError> { + self.supported_locales_set() + .map(|v| v.iter().cloned().collect()) + } + + fn supports_locale(&self, locale: &DataLocale) -> Result { + self.supported_locales_set().map(|v| v.contains(locale)) + } +} diff --git a/provider/datagen/src/transform/cldr/characters/mod.rs b/provider/datagen/src/transform/cldr/characters/mod.rs index 68ea8b7e948..26cd1ee37df 100644 --- a/provider/datagen/src/transform/cldr/characters/mod.rs +++ b/provider/datagen/src/transform/cldr/characters/mod.rs @@ -5,10 +5,10 @@ use std::collections::HashSet; use std::marker::PhantomData; +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_collections::codepointinvliststringlist::CodePointInversionListAndStringList; use icu_properties::provider::*; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use itertools::Itertools; @@ -46,8 +46,8 @@ macro_rules! exemplar_chars_impls { } } - impl IterableDataProvider<$data_marker_name> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$data_marker_name> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .misc() diff --git a/provider/datagen/src/transform/cldr/currency/mod.rs b/provider/datagen/src/transform/cldr/currency/mod.rs index 9157f91a1bd..bd8dc3f35fe 100644 --- a/provider/datagen/src/transform/cldr/currency/mod.rs +++ b/provider/datagen/src/transform/cldr/currency/mod.rs @@ -10,10 +10,10 @@ use tinystr::UnvalidatedTinyAsciiStr; use zerovec::VarZeroVec; use zerovec::ZeroMap; +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use crate::DatagenProvider; use icu_dimension::provider::*; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::BTreeMap; use std::collections::HashMap; @@ -95,8 +95,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .numbers() diff --git a/provider/datagen/src/transform/cldr/datetime/mod.rs b/provider/datagen/src/transform/cldr/datetime/mod.rs index d0c28126adf..097ac024d33 100644 --- a/provider/datagen/src/transform/cldr/datetime/mod.rs +++ b/provider/datagen/src/transform/cldr/datetime/mod.rs @@ -2,13 +2,13 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_datetime::provider::calendar::*; use icu_locid::{ extensions::unicode::{key, value}, Locale, }; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use once_cell::sync::OnceCell; use std::collections::HashMap; @@ -207,8 +207,8 @@ macro_rules! impl_data_provider { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { let mut r = Vec::new(); if DateSkeletonPatternsV1Marker::KEY == $marker::KEY { for (cal_value, cldr_cal) in supported_cals() { diff --git a/provider/datagen/src/transform/cldr/datetime/neo.rs b/provider/datagen/src/transform/cldr/datetime/neo.rs index 3b861f5b12c..fee69df6ddd 100644 --- a/provider/datagen/src/transform/cldr/datetime/neo.rs +++ b/provider/datagen/src/transform/cldr/datetime/neo.rs @@ -3,6 +3,7 @@ // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use super::supported_cals; +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde::ca; use crate::DatagenProvider; use icu_datetime::pattern::{self, CoarseHourCycle}; @@ -681,8 +682,8 @@ impl DataProvider for DatagenProvider { // subtag actually should be produced (by returning a special error), then this code is no longer necessary // and we can use a union of the H12/H24 key lengths arrays, instead checking for preferred hc // in timepattern_convert -impl IterableDataProvider for DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { let calendar = value!("gregory"); let mut r = Vec::new(); @@ -727,8 +728,8 @@ macro_rules! impl_symbols_datagen { } } - impl IterableDataProvider<$marker> for DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { self.supported_locales_neo(value!($calendar), $lengths) } } @@ -743,8 +744,8 @@ macro_rules! impl_pattern_datagen { } } - impl IterableDataProvider<$marker> for DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { self.supported_locales_neo(value!($calendar), $lengths) } } diff --git a/provider/datagen/src/transform/cldr/datetime/week_data.rs b/provider/datagen/src/transform/cldr/datetime/week_data.rs index a4e47565c0d..cd3bbeec098 100644 --- a/provider/datagen/src/transform/cldr/datetime/week_data.rs +++ b/provider/datagen/src/transform/cldr/datetime/week_data.rs @@ -2,18 +2,18 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde::{ self, week_data::{Territory, DEFAULT_TERRITORY}, }; use icu_calendar::provider::{WeekDataV1, WeekDataV1Marker}; use icu_locid::LanguageIdentifier; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::HashSet; -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { let week_data: &cldr_serde::week_data::Resource = self .cldr()? .core() diff --git a/provider/datagen/src/transform/cldr/decimal/compact.rs b/provider/datagen/src/transform/cldr/decimal/compact.rs index 1d7c40a5ffc..393af1e8ca9 100644 --- a/provider/datagen/src/transform/cldr/decimal/compact.rs +++ b/provider/datagen/src/transform/cldr/decimal/compact.rs @@ -2,10 +2,10 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_compactdecimal::provider::*; use icu_locid::extensions::unicode::key; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::convert::TryFrom; @@ -105,14 +105,16 @@ impl DataProvider for crate::DatagenProvid } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal + for crate::DatagenProvider +{ + fn supported_locales_impl(&self) -> Result, DataError> { self.supported_locales() } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { self.supported_locales() } } diff --git a/provider/datagen/src/transform/cldr/decimal/symbols.rs b/provider/datagen/src/transform/cldr/decimal/symbols.rs index 0bc72ed632b..a5f2de3b7fb 100644 --- a/provider/datagen/src/transform/cldr/decimal/symbols.rs +++ b/provider/datagen/src/transform/cldr/decimal/symbols.rs @@ -2,10 +2,10 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_decimal::provider::*; use icu_locid::extensions::unicode::key; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::borrow::Cow; use std::convert::TryFrom; @@ -47,8 +47,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { self.supported_locales() } } diff --git a/provider/datagen/src/transform/cldr/displaynames/language.rs b/provider/datagen/src/transform/cldr/displaynames/language.rs index 8dad1d068e5..cfb9e680db2 100644 --- a/provider/datagen/src/transform/cldr/displaynames/language.rs +++ b/provider/datagen/src/transform/cldr/displaynames/language.rs @@ -2,11 +2,11 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use core::convert::TryFrom; use icu_displaynames::provider::*; use icu_locid::subtags::Language; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::BTreeMap; use zerovec::ule::UnvalidatedStr; @@ -58,8 +58,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .displaynames() @@ -77,8 +77,8 @@ impl IterableDataProvider for crate::DatagenProvid } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .displaynames() diff --git a/provider/datagen/src/transform/cldr/displaynames/region.rs b/provider/datagen/src/transform/cldr/displaynames/region.rs index 4927e295605..c7bbdea7ed3 100644 --- a/provider/datagen/src/transform/cldr/displaynames/region.rs +++ b/provider/datagen/src/transform/cldr/displaynames/region.rs @@ -2,11 +2,11 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use core::convert::TryFrom; use icu_displaynames::provider::*; use icu_locid::subtags::Region; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::BTreeMap; use std::str::FromStr; @@ -35,8 +35,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .displaynames() diff --git a/provider/datagen/src/transform/cldr/displaynames/script.rs b/provider/datagen/src/transform/cldr/displaynames/script.rs index 354f206fd1d..0d347b34008 100644 --- a/provider/datagen/src/transform/cldr/displaynames/script.rs +++ b/provider/datagen/src/transform/cldr/displaynames/script.rs @@ -2,11 +2,11 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use core::convert::TryFrom; use icu_displaynames::provider::*; use icu_locid::{subtags::Script, ParserError}; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::BTreeMap; use std::str::FromStr; @@ -35,8 +35,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .displaynames() diff --git a/provider/datagen/src/transform/cldr/displaynames/variant.rs b/provider/datagen/src/transform/cldr/displaynames/variant.rs index 1adf22ae210..be788f09630 100644 --- a/provider/datagen/src/transform/cldr/displaynames/variant.rs +++ b/provider/datagen/src/transform/cldr/displaynames/variant.rs @@ -2,11 +2,11 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use core::convert::TryFrom; use icu_displaynames::provider::*; use icu_locid::{subtags::Variant, ParserError}; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::collections::BTreeMap; use std::str::FromStr; @@ -35,8 +35,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .displaynames() diff --git a/provider/datagen/src/transform/cldr/list/mod.rs b/provider/datagen/src/transform/cldr/list/mod.rs index baf184b9971..1ffd75d0430 100644 --- a/provider/datagen/src/transform/cldr/list/mod.rs +++ b/provider/datagen/src/transform/cldr/list/mod.rs @@ -2,10 +2,10 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_list::provider::*; use icu_locid::subtags::language; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use once_cell::sync::OnceCell; use std::borrow::Cow; @@ -125,8 +125,8 @@ macro_rules! implement { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .misc() diff --git a/provider/datagen/src/transform/cldr/plurals/mod.rs b/provider/datagen/src/transform/cldr/plurals/mod.rs index e10118cd814..79c1cbe71d6 100644 --- a/provider/datagen/src/transform/cldr/plurals/mod.rs +++ b/provider/datagen/src/transform/cldr/plurals/mod.rs @@ -4,10 +4,10 @@ use std::collections::BTreeMap; +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use icu_plurals::rules::runtime::ast::Rule; use icu_plurals::{provider::*, PluralCategory}; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use zerovec::ZeroMap; @@ -62,8 +62,8 @@ macro_rules! implement { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .get_rules_for(<$marker>::KEY)? .0 @@ -121,8 +121,8 @@ impl DataProvider for crate::DatagenProvider { } } -impl IterableDataProvider for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { +impl IterableDataProviderInternal for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .get_plural_ranges()? .0 diff --git a/provider/datagen/src/transform/cldr/relativetime/mod.rs b/provider/datagen/src/transform/cldr/relativetime/mod.rs index 4a90d45ba83..87805e62f0f 100644 --- a/provider/datagen/src/transform/cldr/relativetime/mod.rs +++ b/provider/datagen/src/transform/cldr/relativetime/mod.rs @@ -4,8 +4,8 @@ use std::borrow::Borrow; +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use icu_relativetime::provider::*; use once_cell::sync::OnceCell; @@ -94,8 +94,8 @@ macro_rules! make_data_provider { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .cldr()? .dates("gregorian") diff --git a/provider/datagen/src/transform/cldr/time_zones/mod.rs b/provider/datagen/src/transform/cldr/time_zones/mod.rs index 4a5bc7ea65e..0a4d96da379 100644 --- a/provider/datagen/src/transform/cldr/time_zones/mod.rs +++ b/provider/datagen/src/transform/cldr/time_zones/mod.rs @@ -2,6 +2,7 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use crate::transform::cldr::cldr_serde; use cldr_serde::time_zones::bcp47_tzid::Bcp47TzidAliasData; use cldr_serde::time_zones::meta_zones::MetazoneAliasData; @@ -9,7 +10,6 @@ use cldr_serde::time_zones::meta_zones::ZonePeriod; use cldr_serde::time_zones::time_zone_names::TimeZoneNames; use icu_datetime::provider::time_zones::*; use icu_datetime::provider::time_zones::{MetazoneId, TimeZoneBcp47Id}; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use icu_timezone::provider::*; use std::collections::BTreeMap; @@ -69,8 +69,8 @@ macro_rules! impl_data_provider { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { if <$marker>::KEY == MetazonePeriodV1Marker::KEY { // MetazonePeriodV1 does not require localized time zone data Ok(vec![Default::default()]) diff --git a/provider/datagen/src/transform/cldr/transforms/mod.rs b/provider/datagen/src/transform/cldr/transforms/mod.rs index 92fd6a8b52a..7392e92fde7 100644 --- a/provider/datagen/src/transform/cldr/transforms/mod.rs +++ b/provider/datagen/src/transform/cldr/transforms/mod.rs @@ -127,6 +127,7 @@ impl DataProvider for crate::DatagenProvider { } impl IterableDataProvider for crate::DatagenProvider { + // Don't do caching for this one. It uses its own mutex fn supported_locales(&self) -> Result, DataError> { self.cldr()? .transforms()? diff --git a/provider/datagen/src/transform/icuexport/collator/mod.rs b/provider/datagen/src/transform/icuexport/collator/mod.rs index 48dd411d30c..72c5f6878a5 100644 --- a/provider/datagen/src/transform/icuexport/collator/mod.rs +++ b/provider/datagen/src/transform/icuexport/collator/mod.rs @@ -5,6 +5,7 @@ //! This module contains provider implementations backed by TOML files //! exported from ICU. +use crate::provider::IterableDataProviderInternal; use icu_collator::provider::*; use icu_collections::codepointtrie::CodePointTrie; use icu_locid::extensions::unicode::key; @@ -12,7 +13,6 @@ use icu_locid::extensions::unicode::Value; use icu_locid::subtags::language; use icu_locid::LanguageIdentifier; use icu_locid::Locale; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::convert::TryFrom; use std::str::FromStr; @@ -137,8 +137,8 @@ macro_rules! collation_provider { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(self .icuexport()? .list(&format!( diff --git a/provider/datagen/src/transform/icuexport/normalizer/mod.rs b/provider/datagen/src/transform/icuexport/normalizer/mod.rs index 4d21087a859..3069ec34fdc 100644 --- a/provider/datagen/src/transform/icuexport/normalizer/mod.rs +++ b/provider/datagen/src/transform/icuexport/normalizer/mod.rs @@ -5,10 +5,10 @@ //! This module contains provider implementations backed by TOML files //! exported from ICU. +use crate::provider::IterableDataProviderInternal; use icu_collections::char16trie::Char16Trie; use icu_collections::codepointtrie::CodePointTrie; use icu_normalizer::provider::*; -use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; use std::convert::TryFrom; use zerovec::ZeroVec; @@ -33,8 +33,8 @@ macro_rules! normalization_provider { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok(vec![DataLocale::default()]) } } diff --git a/provider/datagen/src/transform/mod.rs b/provider/datagen/src/transform/mod.rs index 836684a5c0b..0ad46ed6529 100644 --- a/provider/datagen/src/transform/mod.rs +++ b/provider/datagen/src/transform/mod.rs @@ -31,7 +31,7 @@ impl DatagenProvider { { if ::KEY.metadata().singleton && !req.locale.is_empty() { Err(DataErrorKind::ExtraneousLocale) - } else if !self.supported_locales()?.contains(req.locale) { + } else if !self.supports_locale(req.locale)? { Err(DataErrorKind::MissingLocale) } else { Ok(()) diff --git a/provider/datagen/src/transform/segmenter/dictionary.rs b/provider/datagen/src/transform/segmenter/dictionary.rs index bb77ac5339a..ead6b2120d9 100644 --- a/provider/datagen/src/transform/segmenter/dictionary.rs +++ b/provider/datagen/src/transform/segmenter/dictionary.rs @@ -2,6 +2,7 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::provider::IterableDataProviderInternal; use icu_locid::langid; use icu_provider::datagen::IterableDataProvider; use icu_provider::prelude::*; @@ -79,8 +80,8 @@ macro_rules! implement { } } - impl IterableDataProvider<$marker> for crate::DatagenProvider { - fn supported_locales(&self) -> Result, DataError> { + impl IterableDataProviderInternal<$marker> for crate::DatagenProvider { + fn supported_locales_impl(&self) -> Result, DataError> { Ok($supported .into_iter() .filter_map(model_name_to_data_locale)