• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 crate::extensions::unicode::{SubdivisionId, Value};
6 use crate::preferences::extensions::unicode::errors::PreferencesParseError;
7 use crate::preferences::extensions::unicode::struct_keyword;
8 
9 struct_keyword!(
10     /// A Region Override specifies an alternate region to use for obtaining certain region-specific default values.
11     ///
12     /// The valid values are listed in [LDML](https://unicode.org/reports/tr35/#RegionOverride).
13     [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)]
29 mod test {
30     use super::*;
31     use crate::extensions::unicode;
32     use crate::extensions::unicode::subdivision_suffix;
33     use crate::subtags::region;
34 
35     #[test]
region_override_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 }
64