icu_locale_core/preferences/extensions/unicode/keywords/
regional_subdivision.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::preferences::extensions::unicode::errors::PreferencesParseError;
6use crate::preferences::extensions::unicode::struct_keyword;
7use crate::{
8    extensions::unicode::{SubdivisionId, Value},
9    subtags::Subtag,
10};
11
12struct_keyword!(
13    /// A Unicode Subdivision Identifier defines a regional subdivision used for locales.
14    ///
15    /// The valid values are listed in [LDML](https://unicode.org/reports/tr35/#UnicodeSubdivisionIdentifier).
16    [Copy]
17    RegionalSubdivision,
18    "sd",
19    SubdivisionId,
20    |input: Value| {
21        input
22            .into_single_subtag()
23            .and_then(|subtag| subtag.as_str().parse().ok().map(Self))
24            .ok_or(PreferencesParseError::InvalidKeywordValue)
25    },
26    |input: RegionalSubdivision| {
27        #[allow(clippy::unwrap_used)] // TODO
28        Value::from_subtag(Some(Subtag::try_from_str(&input.0.to_string()).unwrap()))
29    }
30);
31
32#[cfg(test)]
33mod test {
34    use super::*;
35    use crate::extensions::unicode;
36    use crate::extensions::unicode::subdivision_suffix;
37    use crate::subtags::region;
38
39    #[test]
40    fn region_subdivision_test() {
41        let val = unicode::value!("uksct");
42        let rg: RegionalSubdivision = val.try_into().unwrap();
43        assert_eq!(rg.region, region!("UK"));
44        assert_eq!(rg.suffix, subdivision_suffix!("sct"));
45
46        for i in &["4aabel", "a4bel", "ukabcde"] {
47            let val = unicode::Value::try_from_str(i).unwrap();
48            let rg: Result<RegionalSubdivision, _> = val.try_into();
49            assert!(rg.is_err());
50        }
51    }
52}