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