icu_locale_core/preferences/
locale.rs1#[cfg(feature = "alloc")]
6use crate::subtags::Variants;
7use crate::subtags::{Language, Region, Script, Subtag, Variant};
8use crate::DataLocale;
9
10#[derive(#[automatically_derived]
impl ::core::fmt::Debug for LocalePreferences {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["language", "script", "region", "variant", "subdivision",
"ue_region"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.language, &self.script, &self.region, &self.variant,
&self.subdivision, &&self.ue_region];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"LocalePreferences", names, values)
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for LocalePreferences {
#[inline]
fn clone(&self) -> LocalePreferences {
let _: ::core::clone::AssertParamIsClone<Language>;
let _: ::core::clone::AssertParamIsClone<Option<Script>>;
let _: ::core::clone::AssertParamIsClone<Option<Region>>;
let _: ::core::clone::AssertParamIsClone<Option<Variant>>;
let _: ::core::clone::AssertParamIsClone<Option<Subtag>>;
let _: ::core::clone::AssertParamIsClone<Option<Region>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LocalePreferences { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LocalePreferences {
#[inline]
fn eq(&self, other: &LocalePreferences) -> bool {
self.language == other.language && self.script == other.script &&
self.region == other.region && self.variant == other.variant
&& self.subdivision == other.subdivision &&
self.ue_region == other.ue_region
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LocalePreferences {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<Language>;
let _: ::core::cmp::AssertParamIsEq<Option<Script>>;
let _: ::core::cmp::AssertParamIsEq<Option<Region>>;
let _: ::core::cmp::AssertParamIsEq<Option<Variant>>;
let _: ::core::cmp::AssertParamIsEq<Option<Subtag>>;
let _: ::core::cmp::AssertParamIsEq<Option<Region>>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for LocalePreferences {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
::core::hash::Hash::hash(&self.language, state);
::core::hash::Hash::hash(&self.script, state);
::core::hash::Hash::hash(&self.region, state);
::core::hash::Hash::hash(&self.variant, state);
::core::hash::Hash::hash(&self.subdivision, state);
::core::hash::Hash::hash(&self.ue_region, state)
}
}Hash)]
12pub struct LocalePreferences {
13 pub(crate) language: Language,
15 pub(crate) script: Option<Script>,
17 pub(crate) region: Option<Region>,
19 pub(crate) variant: Option<Variant>,
21 pub(crate) subdivision: Option<Subtag>,
23 pub(crate) ue_region: Option<Region>,
25}
26
27impl LocalePreferences {
28 fn to_data_locale_maybe_region_priority(self, region_priority: bool) -> DataLocale {
29 DataLocale {
30 language: self.language,
31 script: self.script,
32 region: match (self.region, self.ue_region) {
33 (Some(_), Some(r)) if region_priority => Some(r),
34 (r, _) => r,
35 },
36 variant: self.variant,
37 subdivision: self.subdivision,
38 }
39 }
40
41 pub fn to_data_locale_region_priority(self) -> DataLocale {
45 self.to_data_locale_maybe_region_priority(true)
46 }
47
48 pub fn to_data_locale_language_priority(self) -> DataLocale {
52 self.to_data_locale_maybe_region_priority(false)
53 }
54}
55impl Default for LocalePreferences {
56 fn default() -> Self {
57 Self::default()
58 }
59}
60
61impl From<&crate::Locale> for LocalePreferences {
62 fn from(loc: &crate::Locale) -> Self {
63 let sd = loc
64 .extensions
65 .unicode
66 .keywords
67 .get(&const {
use crate::extensions::unicode::Key;
match Key::try_from_utf8("sd".as_bytes()) {
Ok(r) => r,
_ => {
::core::panicking::panic_fmt(format_args!("Invalid extensions::unicode::Key: sd"));
}
}
}crate::extensions::unicode::key!("sd"))
68 .and_then(|v| v.as_single_subtag().copied());
69 let ue_region = loc
70 .extensions
71 .unicode
72 .keywords
73 .get(&const {
use crate::extensions::unicode::Key;
match Key::try_from_utf8("rg".as_bytes()) {
Ok(r) => r,
_ => {
::core::panicking::panic_fmt(format_args!("Invalid extensions::unicode::Key: rg"));
}
}
}crate::extensions::unicode::key!("rg"))
74 .and_then(|v| {
75 v.as_single_subtag()
76 .and_then(|s| Region::try_from_str(s.as_str()).ok())
77 });
78 Self {
79 language: loc.id.language,
80 script: loc.id.script,
81 region: loc.id.region,
82 variant: loc.id.variants.iter().copied().next(),
83 subdivision: sd,
84 ue_region,
85 }
86 }
87}
88
89impl From<&crate::LanguageIdentifier> for LocalePreferences {
90 fn from(lid: &crate::LanguageIdentifier) -> Self {
91 Self {
92 language: lid.language,
93 script: lid.script,
94 region: lid.region,
95 variant: lid.variants.iter().copied().next(),
96 subdivision: None,
97 ue_region: None,
98 }
99 }
100}
101
102#[cfg(feature = "alloc")]
104impl From<LocalePreferences> for crate::Locale {
105 fn from(prefs: LocalePreferences) -> Self {
106 Self {
107 id: crate::LanguageIdentifier {
108 language: prefs.language,
109 script: prefs.script,
110 region: prefs.region,
111 variants: prefs
112 .variant
113 .map(Variants::from_variant)
114 .unwrap_or_default(),
115 },
116 extensions: {
117 let mut extensions = crate::extensions::Extensions::default();
118 if let Some(sd) = prefs.subdivision {
119 extensions.unicode.keywords.set(
120 crate::extensions::unicode::key!("sd"),
121 crate::extensions::unicode::Value::from_subtag(Some(sd)),
122 );
123 }
124 if let Some(rg) = prefs.ue_region {
125 #[expect(clippy::unwrap_used)] extensions.unicode.keywords.set(
127 crate::extensions::unicode::key!("rg"),
128 crate::extensions::unicode::Value::try_from_str(rg.as_str()).unwrap(),
129 );
130 }
131 extensions
132 },
133 }
134 }
135}
136
137impl LocalePreferences {
138 pub const fn default() -> Self {
140 Self {
141 language: Language::UNKNOWN,
142 script: None,
143 region: None,
144 variant: None,
145 subdivision: None,
146 ue_region: None,
147 }
148 }
149
150 pub const fn language(&self) -> Language {
152 self.language
153 }
154
155 pub const fn region(&self) -> Option<Region> {
157 self.region
158 }
159
160 pub fn extend(&mut self, other: LocalePreferences) {
162 if !other.language.is_unknown() {
163 self.language = other.language;
164 }
165 if let Some(script) = other.script {
166 self.script = Some(script);
167 }
168 if let Some(region) = other.region {
169 self.region = Some(region);
170 }
171 if let Some(variant) = other.variant {
172 self.variant = Some(variant);
173 }
174 if let Some(sd) = other.subdivision {
175 self.subdivision = Some(sd);
176 }
177 if let Some(ue_region) = other.ue_region {
178 self.ue_region = Some(ue_region);
179 }
180 }
181}