1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5use super::*;
6use icu_locid::subtags::{Language, Region, Script};
7use icu_provider::prelude::*;
8use zerovec::ZeroMap;
9
10#[icu_provider::data_struct(marker(
11 LikelySubtagsV1Marker,
12 "locid_transform/likelysubtags@1",
13 singleton
14))]
15#[derive(Debug, PartialEq, Clone)]
16#[cfg_attr(
17 feature = "datagen",
18 derive(serde::Serialize, databake::Bake),
19 databake(path = icu_locid_transform::provider),
20)]
21#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
22/// This likely subtags data is used for the minimize and maximize operations.
23/// Each field defines a mapping from an old identifier to a new identifier,
24/// based upon the rules in
25/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
26///
27/// The data is stored is broken down into smaller vectors based upon the rules
28/// defined for the likely subtags maximize algorithm.
29///
30/// For efficiency, only the relevant part of the LanguageIdentifier is stored
31/// for searching and replacing. E.g., the `language_script` field is used to store
32/// rules for `LanguageIdentifier`s that contain a language and a script, but not a
33/// region.
34///
35/// <div class="stab unstable">
36/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
37/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
38/// to be stable, their Rust representation might not be. Use with caution.
39/// </div>
40#[yoke(prove_covariance_manually)]
41pub struct LikelySubtagsV1<'data> {
42 /// Language and script.
43 #[cfg_attr(feature = "serde", serde(borrow))]
44 pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
45 /// Language and region.
46 #[cfg_attr(feature = "serde", serde(borrow))]
47 pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
48 /// Just language.
49 #[cfg_attr(feature = "serde", serde(borrow))]
50 pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
51 /// Script and region.
52 #[cfg_attr(feature = "serde", serde(borrow))]
53 pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
54 /// Just script.
55 #[cfg_attr(feature = "serde", serde(borrow))]
56 pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
57 /// Just region.
58 #[cfg_attr(feature = "serde", serde(borrow))]
59 pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
60 /// Undefined.
61 pub und: (Language, Script, Region),
62}
63
64#[icu_provider::data_struct(marker(
65 LikelySubtagsForLanguageV1Marker,
66 "locid_transform/likelysubtags_l@1",
67 singleton
68))]
69#[derive(Debug, PartialEq, Clone)]
70#[cfg_attr(
71 feature = "datagen",
72 derive(serde::Serialize, databake::Bake),
73 databake(path = icu_locid_transform::provider),
74)]
75#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
76/// This likely subtags data is used for the minimize and maximize operations.
77/// Each field defines a mapping from an old identifier to a new identifier,
78/// based upon the rules in
79/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
80///
81/// The data is stored is broken down into smaller vectors based upon the rules
82/// defined for the likely subtags maximize algorithm.
83///
84/// For efficiency, only the relevant part of the LanguageIdentifier is stored
85/// for searching and replacing. E.g., the `language_script` field is used to store
86/// rules for `LanguageIdentifier`s that contain a language and a script, but not a
87/// region.
88///
89/// This struct contains mappings when the input contains a language subtag.
90/// Also see [`LikelySubtagsForScriptRegionV1`].
91///
92/// <div class="stab unstable">
93/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
94/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
95/// to be stable, their Rust representation might not be. Use with caution.
96/// </div>
97#[yoke(prove_covariance_manually)]
98pub struct LikelySubtagsForLanguageV1<'data> {
99 /// Language and script.
100 #[cfg_attr(feature = "serde", serde(borrow))]
101 pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
102 /// Language and region.
103 #[cfg_attr(feature = "serde", serde(borrow))]
104 pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
105 /// Just language.
106 #[cfg_attr(feature = "serde", serde(borrow))]
107 pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
108 /// Undefined.
109 pub und: (Language, Script, Region),
110}
111
112impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsForLanguageV1<'data> {
113 fn from(other: LikelySubtagsV1<'data>) -> Self {
114 Self {
115 language_script: other.language_script,
116 language_region: other.language_region,
117 language: other.language,
118 und: other.und,
119 }
120 }
121}
122
123impl<'data> LikelySubtagsForLanguageV1<'data> {
124 pub(crate) fn clone_from_borrowed(other: &LikelySubtagsV1<'data>) -> Self {
125 Self {
126 language_script: other.language_script.clone(),
127 language_region: other.language_region.clone(),
128 language: other.language.clone(),
129 und: other.und,
130 }
131 }
132}
133
134#[icu_provider::data_struct(marker(
135 LikelySubtagsForScriptRegionV1Marker,
136 "locid_transform/likelysubtags_sr@1",
137 singleton
138))]
139#[derive(Debug, PartialEq, Clone)]
140#[cfg_attr(
141 feature = "datagen",
142 derive(serde::Serialize, databake::Bake),
143 databake(path = icu_locid_transform::provider),
144)]
145#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
146/// This likely subtags data is used for the minimize and maximize operations.
147/// Each field defines a mapping from an old identifier to a new identifier,
148/// based upon the rules in
149/// <https://www.unicode.org/reports/tr35/#Likely_Subtags>.
150///
151/// The data is stored is broken down into smaller vectors based upon the rules
152/// defined for the likely subtags maximize algorithm.
153///
154/// For efficiency, only the relevant part of the LanguageIdentifier is stored
155/// for searching and replacing. E.g., the `script_region` field is used to store
156/// rules for `LanguageIdentifier`s that contain a script and a region, but not a
157/// language.
158///
159/// This struct contains mappings when the input does not contain a language subtag.
160/// Also see [`LikelySubtagsForLanguageV1`].
161///
162/// <div class="stab unstable">
163/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
164/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
165/// to be stable, their Rust representation might not be. Use with caution.
166/// </div>
167#[yoke(prove_covariance_manually)]
168pub struct LikelySubtagsForScriptRegionV1<'data> {
169 /// Script and region.
170 #[cfg_attr(feature = "serde", serde(borrow))]
171 pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
172 /// Just script.
173 #[cfg_attr(feature = "serde", serde(borrow))]
174 pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
175 /// Just region.
176 #[cfg_attr(feature = "serde", serde(borrow))]
177 pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
178}
179
180impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsForScriptRegionV1<'data> {
181 fn from(other: LikelySubtagsV1<'data>) -> Self {
182 Self {
183 script_region: other.script_region,
184 script: other.script,
185 region: other.region,
186 }
187 }
188}
189
190#[icu_provider::data_struct(marker(
191 LikelySubtagsExtendedV1Marker,
192 "locid_transform/likelysubtags_ext@1",
193 singleton
194))]
195#[derive(Debug, PartialEq, Clone)]
196#[cfg_attr(
197 feature = "datagen",
198 derive(serde::Serialize, databake::Bake),
199 databake(path = icu_locid_transform::provider),
200)]
201#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
202/// This likely subtags data is used for full coverage of locales, including ones that
203/// don't otherwise have data in the Common Locale Data Repository (CLDR).
204///
205/// <div class="stab unstable">
206/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
207/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
208/// to be stable, their Rust representation might not be. Use with caution.
209/// </div>
210#[yoke(prove_covariance_manually)]
211pub struct LikelySubtagsExtendedV1<'data> {
212 /// Language and script.
213 #[cfg_attr(feature = "serde", serde(borrow))]
214 pub language_script: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedScript), Region>,
215 /// Language and region.
216 #[cfg_attr(feature = "serde", serde(borrow))]
217 pub language_region: ZeroMap<'data, (UnvalidatedLanguage, UnvalidatedRegion), Script>,
218 /// Just language.
219 #[cfg_attr(feature = "serde", serde(borrow))]
220 pub language: ZeroMap<'data, UnvalidatedLanguage, (Script, Region)>,
221 /// Script and region.
222 #[cfg_attr(feature = "serde", serde(borrow))]
223 pub script_region: ZeroMap<'data, (UnvalidatedScript, UnvalidatedRegion), Language>,
224 /// Just script.
225 #[cfg_attr(feature = "serde", serde(borrow))]
226 pub script: ZeroMap<'data, UnvalidatedScript, (Language, Region)>,
227 /// Just region.
228 #[cfg_attr(feature = "serde", serde(borrow))]
229 pub region: ZeroMap<'data, UnvalidatedRegion, (Language, Script)>,
230}
231
232impl<'data> From<LikelySubtagsV1<'data>> for LikelySubtagsExtendedV1<'data> {
233 fn from(other: LikelySubtagsV1<'data>) -> Self {
234 Self {
235 language_script: other.language_script,
236 language_region: other.language_region,
237 language: other.language,
238 script_region: other.script_region,
239 script: other.script,
240 region: other.region,
241 }
242 }
243}
244