Skip to content

Commit

Permalink
Create and Implement Currency Patterns data provider (#5326)
Browse files Browse the repository at this point in the history
  • Loading branch information
younies authored Aug 6, 2024
1 parent 7d17c57 commit 86b0a00
Show file tree
Hide file tree
Showing 25 changed files with 263 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

// Provider structs must be stable
#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)]

//! Data provider struct definitions for this ICU4X component.
//!
//! Read more about data providers: [`icu_provider`]

use icu_provider::prelude::*;
use zerovec::ZeroMap;

/// Currency Extended V1 data struct.
#[icu_provider::data_struct(marker(CurrencyPatternsDataV1Marker, "currency/patterns@1"))]
#[derive(Debug, Clone, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_experimental::dimension::provider::currency_patterns)
)]
#[yoke(prove_covariance_manually)]
pub struct CurrencyPatternsDataV1<'data> {
/// Contains the unit patterns for a currency based on plural rules.
#[cfg_attr(feature = "serde", serde(borrow))]
pub unit_patterns: ZeroMap<'data, PatternCount, str>,
}

#[zerovec::make_ule(UnitPatternULE)]
#[zerovec::derive(Debug)]
#[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
#[cfg_attr(
feature = "datagen",
derive(serde::Serialize, databake::Bake),
databake(path = icu_experimental::dimension::provider::currency_patterns)
)]
#[repr(u8)]
pub enum PatternCount {
/// UnitPattern `zero`.
Zero = 0,
/// UnitPattern `one`.
One = 1,
/// UnitPattern `two`.
Two = 2,
/// UnitPattern `few`.
Few = 3,
/// UnitPattern `many`.
Many = 4,
/// UnitPattern `other`.
Other = 5,
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ pub use crate::provider::Baked;
)]
#[yoke(prove_covariance_manually)]
pub struct CurrencyExtendedDataV1<'data> {
// TODO: Implement currency pattern selection logic to choose between standard or standard next to text pattern.
/// Contains the localized display names for a currency based on plural rules.
/// For instance, in the "en" locale for the "USD" currency:
/// - "US Dollars" when count is `zero`,
Expand Down
1 change: 1 addition & 0 deletions components/experimental/src/dimension/provider/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

pub mod currency;
pub mod currency_patterns;
pub mod extended_currency;
pub mod pattern_key;
pub mod percent;
Expand Down
1 change: 1 addition & 0 deletions provider/registry/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ macro_rules! registry(
icu::experimental::compactdecimal::provider::LongCompactDecimalFormatDataV1Marker = "compactdecimal/long@1",
icu::experimental::compactdecimal::provider::ShortCompactDecimalFormatDataV1Marker = "compactdecimal/short@1",
icu::experimental::dimension::provider::currency::CurrencyEssentialsV1Marker = "currency/essentials@1",
icu::experimental::dimension::provider::currency_patterns::CurrencyPatternsDataV1Marker = "currency/patterns@1",
icu::experimental::dimension::provider::extended_currency::CurrencyExtendedDataV1Marker = "currency/extended@1",
icu::experimental::dimension::provider::percent::PercentEssentialsV1Marker = "percent/essentials@1",
icu::experimental::dimension::provider::units::UnitsDisplayNameV1Marker = "units/displaynames@1",
Expand Down
10 changes: 10 additions & 0 deletions provider/source/data/debug/currency/patterns@1/ar-EG.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions provider/source/data/debug/currency/patterns@1/ar.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/bn.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/ccp.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/en-001.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/en-ZA.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/en.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/es-AR.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/es.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/fil.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/fr.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions provider/source/data/debug/currency/patterns@1/ja.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions provider/source/data/debug/currency/patterns@1/ru.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions provider/source/data/debug/currency/patterns@1/sr-Latn.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions provider/source/data/debug/currency/patterns@1/sr.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions provider/source/data/debug/currency/patterns@1/th.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions provider/source/data/debug/currency/patterns@1/tr.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions provider/source/data/debug/currency/patterns@1/und.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions provider/source/src/cldr_serde/numbers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,24 @@ pub(crate) struct CurrencyFormattingPatterns {
/// Standard alphaNextToNumber pattern
#[serde(rename = "standard-alphaNextToNumber")]
pub(crate) standard_alpha_next_to_number: Option<String>,

#[serde(rename = "unitPattern-count-zero")]
pub(crate) pattern_zero: Option<String>,

#[serde(rename = "unitPattern-count-one")]
pub(crate) pattern_one: Option<String>,

#[serde(rename = "unitPattern-count-two")]
pub(crate) pattern_two: Option<String>,

#[serde(rename = "unitPattern-count-few")]
pub(crate) pattern_few: Option<String>,

#[serde(rename = "unitPattern-count-many")]
pub(crate) pattern_many: Option<String>,

#[serde(rename = "unitPattern-count-other")]
pub(crate) pattern_other: Option<String>,
}

#[derive(PartialEq, Debug, Deserialize)]
Expand Down
1 change: 1 addition & 0 deletions provider/source/src/currency/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@

pub(crate) mod essentials;
pub(crate) mod extended;
pub(crate) mod patterns;
71 changes: 71 additions & 0 deletions provider/source/src/currency/patterns.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).

use crate::cldr_serde;
use crate::IterableDataProviderCached;
use crate::SourceDataProvider;

use std::collections::HashSet;

use icu::experimental::dimension::provider::currency_patterns::*;
use icu_provider::prelude::*;
use icu_provider::DataProvider;
use zerovec::ZeroMap;

impl DataProvider<CurrencyPatternsDataV1Marker> for SourceDataProvider {
fn load(
&self,
req: DataRequest,
) -> Result<DataResponse<CurrencyPatternsDataV1Marker>, DataError> {
let numbers_resource: &cldr_serde::numbers::Resource = self
.cldr()?
.numbers()
.read_and_parse(req.id.locale, "numbers.json")?;

let default_system = numbers_resource
.main
.value
.numbers
.default_numbering_system
.as_str();

let patterns = &numbers_resource
.main
.value
.numbers
.numsys_data
.currency_patterns
.get(default_system)
.ok_or(DataErrorKind::IdentifierNotFound.into_error())?;

Ok(DataResponse {
metadata: Default::default(),
payload: DataPayload::from_owned(CurrencyPatternsDataV1 {
unit_patterns: ZeroMap::from_iter(
[
(PatternCount::Zero, patterns.pattern_zero.as_deref()),
(PatternCount::One, patterns.pattern_one.as_deref()),
(PatternCount::Two, patterns.pattern_two.as_deref()),
(PatternCount::Few, patterns.pattern_few.as_deref()),
(PatternCount::Many, patterns.pattern_many.as_deref()),
(PatternCount::Other, patterns.pattern_other.as_deref()),
]
.into_iter()
.filter_map(|(count, pattern)| pattern.map(|pattern| (count, pattern))),
),
}),
})
}
}

impl IterableDataProviderCached<CurrencyPatternsDataV1Marker> for SourceDataProvider {
fn iter_ids_cached(&self) -> Result<HashSet<DataIdentifierCow<'static>>, DataError> {
Ok(self
.cldr()?
.numbers()
.list_locales()?
.map(DataIdentifierCow::from_locale)
.collect())
}
}

0 comments on commit 86b0a00

Please sign in to comment.