icu_locale_core/preferences/extensions/unicode/keywords/
region_override.rs

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
5use crate::extensions::unicode::{SubdivisionId, Value};
6use crate::preferences::extensions::unicode::errors::PreferencesParseError;
7use crate::preferences::extensions::unicode::struct_keyword;
8
9struct_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)]
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}