Skip to main content

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    ///
14    /// # Examples
15    ///
16    /// ```
17    /// use icu::locale::locale;
18    /// use icu::locale::extensions::unicode::key;
19    /// use icu::locale::preferences::extensions::unicode::keywords::RegionOverride;
20    /// use writeable::assert_writeable_eq;
21    ///
22    /// // American English with British user preferences
23    /// let locale = locale!("en-US-u-rg-gbzzzz");
24    ///
25    /// let normal_region = locale.id.region.unwrap();
26    /// let rg_extension_value = locale.extensions.unicode.keywords.get(&key!("rg")).unwrap();
27    /// let region_override = RegionOverride::try_from(rg_extension_value.clone()).unwrap();
28    ///
29    /// assert_writeable_eq!(normal_region, "US");
30    /// assert_writeable_eq!(region_override.region, "GB");
31    /// assert_writeable_eq!(region_override.suffix, "zzzz");
32    /// ```
33    [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}