icu_locale_core/preferences/extensions/unicode/keywords/
region_override.rs1use crate::extensions::unicode::{SubdivisionId, Value};
6use crate::preferences::extensions::unicode::errors::PreferencesParseError;
7use crate::preferences::extensions::unicode::struct_keyword;
8
9struct_keyword!(
10 [Copy]
14 RegionOverride,
15 "rg",
16 SubdivisionId,
17 |input: Value| {
18 input
19 .into_single_subtag()
20 .and_then(|subtag| subtag.as_str().parse().ok().map(Self))
21 .ok_or(PreferencesParseError::InvalidKeywordValue)
22 },
23 |input: RegionOverride| {
24 Value::from_subtag(Some(input.0.into_subtag()))
25 }
26);
27
28#[cfg(test)]
29mod test {
30 use super::*;
31 use crate::extensions::unicode;
32 use crate::extensions::unicode::subdivision_suffix;
33 use crate::subtags::region;
34
35 #[test]
36 fn region_override_test() {
37 let val = unicode::value!("uksct");
38 let rg: RegionOverride = val.try_into().unwrap();
39 assert_eq!(rg.0.region, region!("UK"));
40 assert_eq!(rg.0.suffix, subdivision_suffix!("sct"));
41
42 let val = unicode::value!("usca");
43 let rg: RegionOverride = val.try_into().unwrap();
44 assert_eq!(rg.0.region, region!("US"));
45 assert_eq!(rg.0.suffix, subdivision_suffix!("ca"));
46
47 let val = unicode::value!("419bel");
48 let rg: RegionOverride = val.try_into().unwrap();
49 assert_eq!(rg.0.region, region!("419"));
50 assert_eq!(rg.0.suffix, subdivision_suffix!("bel"));
51
52 let val = unicode::value!("uszzzz");
53 let rg: RegionOverride = val.try_into().unwrap();
54 assert_eq!(rg.0.region, region!("us"));
55 assert_eq!(rg.0.suffix, subdivision_suffix!("zzzz"));
56
57 for i in &["4aabel", "a4bel", "ukabcde"] {
58 let val = unicode::Value::try_from_str(i).unwrap();
59 let rg: Result<RegionOverride, _> = val.try_into();
60 assert!(rg.is_err());
61 }
62 }
63}