diff options
Diffstat (limited to '')
-rw-r--r-- | vendor/icu_provider_adapters/src/empty.rs | 23 | ||||
-rw-r--r-- | vendor/icu_provider_adapters/src/fallback/adapter.rs | 12 | ||||
-rw-r--r-- | vendor/icu_provider_adapters/src/fallback/algorithms.rs | 26 | ||||
-rw-r--r-- | vendor/icu_provider_adapters/src/fallback/mod.rs | 94 | ||||
-rw-r--r-- | vendor/icu_provider_adapters/src/fork/by_error.rs | 39 |
5 files changed, 147 insertions, 47 deletions
diff --git a/vendor/icu_provider_adapters/src/empty.rs b/vendor/icu_provider_adapters/src/empty.rs index 31a6c42aa..85c6b9bc1 100644 --- a/vendor/icu_provider_adapters/src/empty.rs +++ b/vendor/icu_provider_adapters/src/empty.rs @@ -86,3 +86,26 @@ where Err(self.error_kind.with_req(M::KEY, base_req)) } } + +#[cfg(feature = "datagen")] +impl<M> icu_provider::datagen::IterableDataProvider<M> for EmptyDataProvider +where + M: KeyedDataMarker, +{ + fn supported_locales(&self) -> Result<alloc::vec::Vec<DataLocale>, DataError> { + Ok(vec![]) + } +} + +#[cfg(feature = "datagen")] +impl<M> icu_provider::datagen::IterableDynamicDataProvider<M> for EmptyDataProvider +where + M: DataMarker, +{ + fn supported_locales_for_key( + &self, + _: DataKey, + ) -> Result<alloc::vec::Vec<DataLocale>, DataError> { + Ok(vec![]) + } +} diff --git a/vendor/icu_provider_adapters/src/fallback/adapter.rs b/vendor/icu_provider_adapters/src/fallback/adapter.rs index 4d1f79255..f7cc10fe6 100644 --- a/vendor/icu_provider_adapters/src/fallback/adapter.rs +++ b/vendor/icu_provider_adapters/src/fallback/adapter.rs @@ -35,14 +35,15 @@ use crate::helpers::result_is_err_missing_data_options; /// DataProvider::<HelloWorldV1Marker>::load(&provider, req).expect("successful with vertical fallback"); /// /// assert_eq!( -/// "ja", -/// response.metadata.locale.unwrap().to_string() +/// response.metadata.locale.unwrap(), +/// locale!("ja").into(), /// ); /// assert_eq!( +/// response.payload.unwrap().get().message, /// "こんにちは世界", -/// response.payload.unwrap().get().message /// ); /// ``` +#[derive(Clone)] pub struct LocaleFallbackProvider<P> { inner: P, fallbacker: LocaleFallbacker, @@ -161,6 +162,11 @@ impl<P> LocaleFallbackProvider<P> { &self.inner } + /// Returns a mutable reference to the inner provider. + pub fn inner_mut(&mut self) -> &mut P { + &mut self.inner + } + /// Returns ownership of the inner provider to the caller. pub fn into_inner(self) -> P { self.inner diff --git a/vendor/icu_provider_adapters/src/fallback/algorithms.rs b/vendor/icu_provider_adapters/src/fallback/algorithms.rs index 9af52ef6d..0edc59304 100644 --- a/vendor/icu_provider_adapters/src/fallback/algorithms.rs +++ b/vendor/icu_provider_adapters/src/fallback/algorithms.rs @@ -207,6 +207,7 @@ mod tests { use super::*; use icu_locid::Locale; use std::str::FromStr; + use writeable::Writeable; struct TestCase { input: &'static str, @@ -355,6 +356,25 @@ mod tests { expected_region_chain: &["hi-Latn-IN", "und-IN"], }, TestCase { + input: "zh-CN", + requires_data: true, + extension_key: None, + fallback_supplement: None, + // Note: "zh-Hans" is not reachable because it is the default script for "zh". + // The fallback algorithm does not visit the language-script bundle when the + // script is the default for the language + expected_language_chain: &["zh-CN", "zh"], + expected_region_chain: &["zh-CN", "und-CN"], + }, + TestCase { + input: "zh-TW", + requires_data: true, + extension_key: None, + fallback_supplement: None, + expected_language_chain: &["zh-TW", "zh-Hant-TW", "zh-Hant"], + expected_region_chain: &["zh-TW", "und-TW"], + }, + TestCase { input: "yue-HK", requires_data: true, extension_key: None, @@ -396,10 +416,10 @@ mod tests { }; let locale = DataLocale::from(Locale::from_str(cas.input).unwrap()); let mut it = key_fallbacker.fallback_for(locale); - for expected in expected_chain { + for &expected in expected_chain { assert_eq!( expected, - &it.get().to_string(), + &*it.get().write_to_string(), "{:?} ({:?})", cas.input, priority @@ -408,7 +428,7 @@ mod tests { } assert_eq!( "und", - it.get().to_string(), + &*it.get().write_to_string(), "{:?} ({:?})", cas.input, priority diff --git a/vendor/icu_provider_adapters/src/fallback/mod.rs b/vendor/icu_provider_adapters/src/fallback/mod.rs index 6ec636a09..81adad41c 100644 --- a/vendor/icu_provider_adapters/src/fallback/mod.rs +++ b/vendor/icu_provider_adapters/src/fallback/mod.rs @@ -15,6 +15,7 @@ //! Run the locale fallback algorithm: //! //! ``` +//! use icu_locid::locale; //! use icu_provider_adapters::fallback::LocaleFallbacker; //! use icu_provider::prelude::*; //! @@ -26,20 +27,20 @@ //! let key_fallbacker = fallbacker.for_config(Default::default()); //! //! // Set up the fallback iterator. -//! let mut fallback_iterator = key_fallbacker.fallback_for(icu_locid::locale!("hi-Latn-IN").into()); +//! let mut fallback_iterator = key_fallbacker.fallback_for(DataLocale::from(locale!("hi-Latn-IN"))); //! //! // Run the algorithm and check the results. -//! assert_eq!(fallback_iterator.get().to_string(), "hi-Latn-IN"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("hi-Latn-IN"))); //! fallback_iterator.step(); -//! assert_eq!(fallback_iterator.get().to_string(), "hi-Latn"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("hi-Latn"))); //! fallback_iterator.step(); -//! assert_eq!(fallback_iterator.get().to_string(), "en-IN"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("en-IN"))); //! fallback_iterator.step(); -//! assert_eq!(fallback_iterator.get().to_string(), "en-001"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("en-001"))); //! fallback_iterator.step(); -//! assert_eq!(fallback_iterator.get().to_string(), "en"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("en"))); //! fallback_iterator.step(); -//! assert_eq!(fallback_iterator.get().to_string(), "und"); +//! assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); //! ``` use icu_locid::extensions::unicode::{Key, Value}; @@ -67,6 +68,7 @@ pub struct LocaleFallbackConfig { /// Retain the language and script subtags until the final step: /// /// ``` + /// use icu_locid::locale; /// use icu_provider::prelude::*; /// use icu_provider::FallbackPriority; /// use icu_provider_adapters::fallback::LocaleFallbackConfig; @@ -80,21 +82,25 @@ pub struct LocaleFallbackConfig { /// config.priority = FallbackPriority::Language; /// let key_fallbacker = fallbacker.for_config(config); /// let mut fallback_iterator = key_fallbacker - /// .fallback_for(icu_locid::locale!("ca-ES-valencia").into()); + /// .fallback_for(DataLocale::from(locale!("ca-ES-valencia"))); /// /// // Run the algorithm and check the results. - /// assert_eq!(fallback_iterator.get().to_string(), "ca-ES-valencia"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("ca-ES-valencia")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "ca-ES"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("ca-ES"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "ca"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("ca"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); /// ``` /// /// Retain the region subtag until the final step: /// /// ``` + /// use icu_locid::locale; /// use icu_provider::prelude::*; /// use icu_provider::FallbackPriority; /// use icu_provider_adapters::fallback::LocaleFallbackConfig; @@ -108,18 +114,27 @@ pub struct LocaleFallbackConfig { /// config.priority = FallbackPriority::Region; /// let key_fallbacker = fallbacker.for_config(config); /// let mut fallback_iterator = key_fallbacker - /// .fallback_for(icu_locid::locale!("ca-ES-valencia").into()); + /// .fallback_for(DataLocale::from(locale!("ca-ES-valencia"))); /// /// // Run the algorithm and check the results. - /// assert_eq!(fallback_iterator.get().to_string(), "ca-ES-valencia"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("ca-ES-valencia")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "ca-ES"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("ca-ES"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und-ES-valencia"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("und-ES-valencia")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und-ES"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("und-ES")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); /// ``` pub priority: FallbackPriority, /// An extension keyword to retain during locale fallback. @@ -127,6 +142,7 @@ pub struct LocaleFallbackConfig { /// # Examples /// /// ``` + /// use icu_locid::locale; /// use icu_provider::prelude::*; /// use icu_provider_adapters::fallback::LocaleFallbackConfig; /// use icu_provider_adapters::fallback::LocaleFallbacker; @@ -139,16 +155,19 @@ pub struct LocaleFallbackConfig { /// config.extension_key = Some(icu_locid::extensions_unicode_key!("nu")); /// let key_fallbacker = fallbacker.for_config(config); /// let mut fallback_iterator = key_fallbacker - /// .fallback_for(icu_locid::locale!("ar-EG-u-nu-latn").into()); + /// .fallback_for(DataLocale::from(locale!("ar-EG-u-nu-latn"))); /// /// // Run the algorithm and check the results. - /// assert_eq!(fallback_iterator.get().to_string(), "ar-EG-u-nu-latn"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("ar-EG-u-nu-latn")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "ar-EG"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("ar-EG"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "ar"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("ar"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); /// ``` pub extension_key: Option<Key>, /// Fallback supplement data key to customize fallback rules. @@ -162,6 +181,7 @@ pub struct LocaleFallbackConfig { /// # Examples /// /// ``` + /// use icu_locid::locale; /// use icu_provider::prelude::*; /// use icu_provider::FallbackPriority; /// use icu_provider::FallbackSupplement; @@ -178,17 +198,23 @@ pub struct LocaleFallbackConfig { /// config.fallback_supplement = Some(FallbackSupplement::Collation); /// let key_fallbacker = fallbacker.for_config(config); /// let mut fallback_iterator = - /// key_fallbacker.fallback_for(icu_locid::locale!("yue-HK").into()); + /// key_fallbacker.fallback_for(DataLocale::from(locale!("yue-HK"))); /// /// // Run the algorithm and check the results. /// // TODO(#1964): add "zh" as a target. - /// assert_eq!(fallback_iterator.get().to_string(), "yue-HK"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("yue-HK")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "yue"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("yue"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "zh-Hant"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("zh-Hant")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); /// ``` pub fallback_supplement: Option<FallbackSupplement>, } @@ -303,6 +329,7 @@ impl LocaleFallbacker { /// # Examples /// /// ``` + /// use icu_locid::locale; /// use icu_provider::prelude::*; /// use icu_provider_adapters::fallback::LocaleFallbacker; /// use std::borrow::Cow; @@ -323,14 +350,17 @@ impl LocaleFallbacker { /// .expect("data"); /// let key_fallbacker = fallbacker.for_key(FooV1Marker::KEY); /// let mut fallback_iterator = - /// key_fallbacker.fallback_for(icu_locid::locale!("en-GB").into()); + /// key_fallbacker.fallback_for(DataLocale::from(locale!("en-GB"))); /// /// // Run the algorithm and check the results. - /// assert_eq!(fallback_iterator.get().to_string(), "en-GB"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("en-GB"))); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und-GB"); + /// assert_eq!( + /// fallback_iterator.get(), + /// &DataLocale::from(locale!("und-GB")) + /// ); /// fallback_iterator.step(); - /// assert_eq!(fallback_iterator.get().to_string(), "und"); + /// assert_eq!(fallback_iterator.get(), &DataLocale::from(locale!("und"))); /// ``` /// /// [`DataRequestMetadata`]: icu_provider::DataRequestMetadata diff --git a/vendor/icu_provider_adapters/src/fork/by_error.rs b/vendor/icu_provider_adapters/src/fork/by_error.rs index 5069229fa..b3badb147 100644 --- a/vendor/icu_provider_adapters/src/fork/by_error.rs +++ b/vendor/icu_provider_adapters/src/fork/by_error.rs @@ -32,6 +32,11 @@ impl<P0, P1, F> ForkByErrorProvider<P0, P1, F> { (&self.0, &self.1) } + /// Returns mutable references to the inner providers. + pub fn inner_mut(&mut self) -> (&mut P0, &mut P1) { + (&mut self.0, &mut self.1) + } + /// Returns ownership of the inner providers to the caller. pub fn into_inner(self) -> (P0, P1) { (self.0, self.1) @@ -142,10 +147,20 @@ impl<P, F> MultiForkByErrorProvider<P, F> { &self.providers } + /// Exposes a mutable vector of providers to a closure so it can be mutated. + pub fn with_inner_mut(&mut self, f: impl FnOnce(&mut Vec<P>)) { + f(&mut self.providers) + } + /// Returns ownership of the inner providers to the caller. pub fn into_inner(self) -> Vec<P> { self.providers } + + /// Adds an additional child provider. + pub fn push(&mut self, provider: P) { + self.providers.push(provider); + } } impl<P, F> BufferProvider for MultiForkByErrorProvider<P, F> @@ -158,15 +173,16 @@ where key: DataKey, req: DataRequest, ) -> Result<DataResponse<BufferMarker>, DataError> { + let mut last_error = DataErrorKind::MissingDataKey.with_key(key); for provider in self.providers.iter() { let result = provider.load_buffer(key, req); match result { Ok(ok) => return Ok(ok), Err(err) if !self.predicate.test(key, Some(req), err) => return Err(err), - _ => (), + Err(err) => last_error = err, }; } - Err(DataErrorKind::MissingDataKey.with_key(key)) + Err(last_error) } } @@ -176,15 +192,16 @@ where F: ForkByErrorPredicate, { fn load_any(&self, key: DataKey, req: DataRequest) -> Result<AnyResponse, DataError> { + let mut last_error = DataErrorKind::MissingDataKey.with_key(key); for provider in self.providers.iter() { let result = provider.load_any(key, req); match result { Ok(ok) => return Ok(ok), Err(err) if !self.predicate.test(key, Some(req), err) => return Err(err), - _ => (), + Err(err) => last_error = err, }; } - Err(DataErrorKind::MissingDataKey.with_key(key)) + Err(last_error) } } @@ -195,15 +212,16 @@ where F: ForkByErrorPredicate, { fn load_data(&self, key: DataKey, req: DataRequest) -> Result<DataResponse<M>, DataError> { + let mut last_error = DataErrorKind::MissingDataKey.with_key(key); for provider in self.providers.iter() { let result = provider.load_data(key, req); match result { Ok(ok) => return Ok(ok), Err(err) if !self.predicate.test(key, Some(req), err) => return Err(err), - _ => (), + Err(err) => last_error = err, }; } - Err(DataErrorKind::MissingDataKey.with_key(key)) + Err(last_error) } } @@ -215,15 +233,16 @@ where F: ForkByErrorPredicate, { fn supported_locales_for_key(&self, key: DataKey) -> Result<Vec<DataLocale>, DataError> { + let mut last_error = DataErrorKind::MissingDataKey.with_key(key); for provider in self.providers.iter() { let result = provider.supported_locales_for_key(key); match result { Ok(ok) => return Ok(ok), Err(err) if !self.predicate.test(key, None, err) => return Err(err), - _ => (), + Err(err) => last_error = err, }; } - Err(DataErrorKind::MissingDataKey.with_key(key)) + Err(last_error) } } @@ -240,6 +259,7 @@ where key: DataKey, mut from: DataPayload<MFrom>, ) -> Result<DataPayload<MTo>, (DataPayload<MFrom>, DataError)> { + let mut last_error = DataErrorKind::MissingDataKey.with_key(key); for provider in self.providers.iter() { let result = provider.convert(key, from); match result { @@ -250,10 +270,11 @@ where return Err((returned, err)); } from = returned; + last_error = err; } }; } - Err((from, DataErrorKind::MissingDataKey.with_key(key))) + Err((from, last_error)) } } |