icu_locale_core/preferences/extensions/unicode/keywords/
regional_subdivision.rs1use 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 [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)] 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}