| 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 | |
| 5 | use super::*; |
| 6 | use icu_locid::subtags::{Language, Region, Script}; |
| 7 | use icu_provider::prelude::*; |
| 8 | use 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)] |
| 41 | pub 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)] |
| 98 | pub 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 | |
| 112 | impl<'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 | |
| 123 | impl<'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)] |
| 168 | pub 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 | |
| 180 | impl<'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)] |
| 211 | pub 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 | |
| 232 | impl<'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 | |