icu_locid_transform/provider/
canonicalizer.rs1use super::*;
6use icu_locid::subtags::{Language, Region, Script, Variant};
7use icu_provider::prelude::*;
8use tinystr::UnvalidatedTinyAsciiStr;
9use zerovec::{VarZeroVec, ZeroMap, ZeroSlice};
10
11#[icu_provider::data_struct(marker(AliasesV1Marker, "locid_transform/aliases@1", singleton))]
12#[derive(PartialEq, Clone, Default)]
13#[cfg_attr(
14 feature = "datagen",
15 derive(serde::Serialize, databake::Bake),
16 databake(path = icu_locid_transform::provider),
17)]
18#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
19#[yoke(prove_covariance_manually)]
20#[derive(Debug)]
40pub struct AliasesV1<'data> {
41 #[cfg_attr(feature = "serde", serde(borrow))]
44 pub language_variants: VarZeroVec<'data, UnvalidatedLanguageIdentifierPair>,
45 #[cfg_attr(feature = "serde", serde(borrow))]
47 pub sgn_region: ZeroMap<'data, UnvalidatedRegion, Language>,
48 #[cfg_attr(feature = "serde", serde(borrow))]
50 pub language_len2: ZeroMap<'data, UnvalidatedTinyAsciiStr<2>, UnvalidatedLanguageIdentifier>,
51 #[cfg_attr(feature = "serde", serde(borrow))]
53 pub language_len3: ZeroMap<'data, UnvalidatedLanguage, UnvalidatedLanguageIdentifier>,
54 #[cfg_attr(feature = "serde", serde(borrow))]
57 pub language: VarZeroVec<'data, UnvalidatedLanguageIdentifierPair>,
58
59 #[cfg_attr(feature = "serde", serde(borrow))]
61 pub script: ZeroMap<'data, UnvalidatedScript, Script>,
62
63 #[cfg_attr(feature = "serde", serde(borrow))]
65 pub region_alpha: ZeroMap<'data, UnvalidatedTinyAsciiStr<2>, Region>,
66 #[cfg_attr(feature = "serde", serde(borrow))]
68 pub region_num: ZeroMap<'data, UnvalidatedRegion, Region>,
69
70 #[cfg_attr(feature = "serde", serde(borrow))]
72 pub complex_region: ZeroMap<'data, UnvalidatedRegion, ZeroSlice<Region>>,
73
74 #[cfg_attr(feature = "serde", serde(borrow))]
76 pub variant: ZeroMap<'data, UnvalidatedVariant, Variant>,
77
78 #[cfg_attr(feature = "serde", serde(borrow))]
80 pub subdivision: ZeroMap<'data, UnvalidatedSubdivision, SemivalidatedSubdivision>,
81}
82
83#[cfg(feature = "datagen")]
84impl<'data> From<AliasesV2<'data>> for AliasesV1<'data> {
85 fn from(value: AliasesV2<'data>) -> Self {
86 let language_variants = value
87 .language_variants
88 .iter()
89 .map(zerofrom::ZeroFrom::zero_from)
90 .map(|v: LanguageStrStrPair| {
91 let langid = alloc::format!("{0}-{1}", v.0, v.1);
92 StrStrPair(langid.into(), v.2)
93 })
94 .collect::<alloc::vec::Vec<StrStrPair>>();
95
96 Self {
97 language_variants: VarZeroVec::from(&language_variants),
98 sgn_region: value.sgn_region,
99 language_len2: value.language_len2,
100 language_len3: value.language_len3,
101 language: value.language,
102 script: value.script,
103 region_alpha: value.region_alpha,
104 region_num: value.region_num,
105 complex_region: value.complex_region,
106 variant: value.variant,
107 subdivision: value.subdivision,
108 }
109 }
110}
111
112impl<'data> TryFrom<AliasesV1<'data>> for AliasesV2<'data> {
113 type Error = icu_provider::DataError;
114
115 fn try_from(value: AliasesV1<'data>) -> Result<Self, Self::Error> {
116 #[allow(unused_imports)]
117 use alloc::borrow::ToOwned;
118
119 let language_variants = value
120 .language_variants
121 .iter()
122 .map(zerofrom::ZeroFrom::zero_from)
123 .map(|v: StrStrPair| -> Result<LanguageStrStrPair, DataError> {
124 let (lang, variant) =
125 v.0.split_once('-')
126 .ok_or_else(|| DataError::custom("Each pair should be language-variant"))?;
127 let lang: Language = lang
128 .parse()
129 .map_err(|_| DataError::custom("Language should be a valid language subtag"))?;
130 Ok(LanguageStrStrPair(lang, variant.to_owned().into(), v.1))
131 })
132 .collect::<Result<alloc::vec::Vec<_>, _>>()?;
133
134 Ok(Self {
135 language_variants: VarZeroVec::from(&language_variants),
136 sgn_region: value.sgn_region,
137 language_len2: value.language_len2,
138 language_len3: value.language_len3,
139 language: value.language,
140 script: value.script,
141 region_alpha: value.region_alpha,
142 region_num: value.region_num,
143 complex_region: value.complex_region,
144 variant: value.variant,
145 subdivision: value.subdivision,
146 })
147 }
148}
149
150#[icu_provider::data_struct(marker(AliasesV2Marker, "locid_transform/aliases@2", singleton))]
151#[derive(PartialEq, Clone, Default)]
152#[cfg_attr(
153 feature = "datagen",
154 derive(serde::Serialize, databake::Bake),
155 databake(path = icu_locid_transform::provider),
156)]
157#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
158#[yoke(prove_covariance_manually)]
159#[derive(Debug)]
181pub struct AliasesV2<'data> {
182 #[cfg_attr(feature = "serde", serde(borrow))]
185 pub language_variants: VarZeroVec<'data, UnvalidatedLanguageVariantsPair>,
186 #[cfg_attr(feature = "serde", serde(borrow))]
188 pub sgn_region: ZeroMap<'data, UnvalidatedRegion, Language>,
189 #[cfg_attr(feature = "serde", serde(borrow))]
191 pub language_len2: ZeroMap<'data, UnvalidatedTinyAsciiStr<2>, UnvalidatedLanguageIdentifier>,
192 #[cfg_attr(feature = "serde", serde(borrow))]
194 pub language_len3: ZeroMap<'data, UnvalidatedLanguage, UnvalidatedLanguageIdentifier>,
195 #[cfg_attr(feature = "serde", serde(borrow))]
198 pub language: VarZeroVec<'data, UnvalidatedLanguageIdentifierPair>,
199
200 #[cfg_attr(feature = "serde", serde(borrow))]
202 pub script: ZeroMap<'data, UnvalidatedScript, Script>,
203
204 #[cfg_attr(feature = "serde", serde(borrow))]
206 pub region_alpha: ZeroMap<'data, UnvalidatedTinyAsciiStr<2>, Region>,
207 #[cfg_attr(feature = "serde", serde(borrow))]
209 pub region_num: ZeroMap<'data, UnvalidatedRegion, Region>,
210
211 #[cfg_attr(feature = "serde", serde(borrow))]
213 pub complex_region: ZeroMap<'data, UnvalidatedRegion, ZeroSlice<Region>>,
214
215 #[cfg_attr(feature = "serde", serde(borrow))]
217 pub variant: ZeroMap<'data, UnvalidatedVariant, Variant>,
218
219 #[cfg_attr(feature = "serde", serde(borrow))]
221 pub subdivision: ZeroMap<'data, UnvalidatedSubdivision, SemivalidatedSubdivision>,
222}