From a6647d1fd8200e08e268c573b0d5ea8ea873756f Mon Sep 17 00:00:00 2001 From: snktd Date: Tue, 30 May 2023 13:06:31 -0700 Subject: [PATCH] Merge remote-tracking branch 'upstream/main' --- experimental/displaynames/src/displaynames.rs | 80 ++++++++++++++++++- experimental/displaynames/src/lib.rs | 1 + 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/experimental/displaynames/src/displaynames.rs b/experimental/displaynames/src/displaynames.rs index 7143fbd6fad..b1cde9182e6 100644 --- a/experimental/displaynames/src/displaynames.rs +++ b/experimental/displaynames/src/displaynames.rs @@ -7,7 +7,7 @@ use crate::options::*; use crate::provider::*; use alloc::borrow::Cow; -use icu_locid::{subtags::Language, subtags::Region, subtags::Script, Locale}; +use icu_locid::{subtags::Language, subtags::Region, subtags::Script, subtags::Variant, Locale}; use icu_provider::prelude::*; /// Lookup of the locale-specific display names by region code. @@ -161,6 +161,77 @@ impl ScriptDisplayNames { } } +/// Lookup of the locale-specific display names by variant. +/// +/// # Example +/// +/// ``` +/// use icu_displaynames::{DisplayNamesOptions, VariantDisplayNames}; +/// use icu_locid::{locale, subtags_variant as variant}; +/// +/// let locale = locale!("en-001"); +/// let options: DisplayNamesOptions = Default::default(); +/// let display_name = VariantDisplayNames::try_new_unstable( +/// &icu_testdata::unstable(), +/// &locale.into(), +/// options, +/// ) +/// .expect("Data should load successfully"); +/// +/// assert_eq!(display_name.of(variant!("POSIX")), Some("Computer")); +/// ``` +#[derive(Default)] +pub struct VariantDisplayNames { + #[allow(dead_code)] //TODO: Add DisplayNamesOptions support for Variants. + options: DisplayNamesOptions, + variant_data: DataPayload, +} + +#[allow(dead_code)] // not public at the moment +impl VariantDisplayNames { + /// Creates a new [`VariantDisplayNames`] from locale data and an options bag. + /// + /// [📚 Help choosing a constructor](icu_provider::constructors) + ///
+ /// ⚠️ The bounds on this function may change over time, including in SemVer minor releases. + ///
+ pub fn try_new_unstable + ?Sized>( + data_provider: &D, + locale: &DataLocale, + options: DisplayNamesOptions, + ) -> Result { + let variant_data = data_provider + .load(DataRequest { + locale, + metadata: Default::default(), + })? + .take_payload()?; + + Ok(Self { + options, + variant_data, + }) + } + + icu_provider::gen_any_buffer_constructors!( + locale: include, + options: DisplayNamesOptions, + error: DataError, + functions: [ + Self::try_new_unstable, + try_new_with_any_provider, + try_new_with_buffer_provider + ] + ); + + /// Returns the display name of a variant. + pub fn of(&self, variant: Variant) -> Option<&str> { + let data = self.variant_data.get(); + data.names.get(&variant.into_tinystr().to_unvalidated()) + // TODO: Respect options.fallback + } +} + /// Lookup of the locale-specific display names by language code. /// /// # Example @@ -274,7 +345,8 @@ pub struct LocaleDisplayNamesFormatter { #[allow(dead_code)] // TODO use this script_data: DataPayload, region_data: DataPayload, - // variant_data: DataPayload, + #[allow(dead_code)] // TODO add support for variants + variant_data: DataPayload, // key_data: DataPayload, // measuerment_data: DataPayload, // subdivisions_data: DataPayload, @@ -297,7 +369,8 @@ impl LocaleDisplayNamesFormatter { D: DataProvider + DataProvider + DataProvider - + DataProvider, + + DataProvider + + DataProvider, { let req = DataRequest { locale, @@ -310,6 +383,7 @@ impl LocaleDisplayNamesFormatter { locale_data: data_provider.load(req)?.take_payload()?, script_data: data_provider.load(req)?.take_payload()?, region_data: data_provider.load(req)?.take_payload()?, + variant_data: data_provider.load(req)?.take_payload()?, }) } diff --git a/experimental/displaynames/src/lib.rs b/experimental/displaynames/src/lib.rs index a2de2989e13..1c8b1070a6e 100644 --- a/experimental/displaynames/src/lib.rs +++ b/experimental/displaynames/src/lib.rs @@ -43,6 +43,7 @@ pub use displaynames::LanguageDisplayNames; pub use displaynames::LocaleDisplayNamesFormatter; pub use displaynames::RegionDisplayNames; pub use displaynames::ScriptDisplayNames; +pub use displaynames::VariantDisplayNames; pub use options::DisplayNamesOptions; pub use options::Fallback; pub use options::LanguageDisplay;