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]
34 RegionOverride,
35 "rg",
36 SubdivisionId,
37 |input: &Value| {
38 input
39 .as_single_subtag()
40 .and_then(|subtag| subtag.as_str().parse().ok().map(Self))
41 .ok_or(PreferencesParseError::InvalidKeywordValue)
42 },
43 |input: &RegionOverride| {
44 Value::from_subtag(Some(input.0.into_subtag()))
45 }
46);
47
48#[cfg(test)]
49mod test {
50 use super::*;
51 use crate::extensions::unicode;
52 use crate::extensions::unicode::subdivision_suffix;
53 use crate::subtags::region;
54
55 #[test]
56 fn region_override_test() {
57 let val = unicode::value!("uksct");
58 let rg: RegionOverride = val.try_into().unwrap();
59 assert_eq!(rg.0.region, region!("UK"));
60 assert_eq!(rg.0.suffix, subdivision_suffix!("sct"));
61
62 let val = unicode::value!("usca");
63 let rg: RegionOverride = val.try_into().unwrap();
64 assert_eq!(rg.0.region, region!("US"));
65 assert_eq!(rg.0.suffix, subdivision_suffix!("ca"));
66
67 let val = unicode::value!("419bel");
68 let rg: RegionOverride = val.try_into().unwrap();
69 assert_eq!(rg.0.region, region!("419"));
70 assert_eq!(rg.0.suffix, subdivision_suffix!("bel"));
71
72 let val = unicode::value!("uszzzz");
73 let rg: RegionOverride = val.try_into().unwrap();
74 assert_eq!(rg.0.region, region!("us"));
75 assert_eq!(rg.0.suffix, subdivision_suffix!("zzzz"));
76
77 for i in &["4aabel", "a4bel", "ukabcde"] {
78 let val = Value::try_from_str(i).unwrap();
79 let rg: Result<RegionOverride, _> = val.try_into();
80 assert!(rg.is_err());
81 }
82 }
83}