• 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::preferences::extensions::unicode::errors::PreferencesParseError;
6 use crate::preferences::extensions::unicode::struct_keyword;
7 use crate::{
8     extensions::unicode::{SubdivisionId, Value},
9     subtags::Subtag,
10 };
11 
12 struct_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)]
33 mod test {
34     use super::*;
35     use crate::extensions::unicode;
36     use crate::extensions::unicode::subdivision_suffix;
37     use crate::subtags::region;
38 
39     #[test]
region_subdivision_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 }
53