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::extensions::unicode::{SubdivisionId, Value}; 6 use crate::preferences::extensions::unicode::errors::PreferencesParseError; 7 use crate::preferences::extensions::unicode::struct_keyword; 8 9 struct_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 [Copy] 14 RegionOverride, 15 "rg", 16 SubdivisionId, 17 |input: Value| { 18 input 19 .into_single_subtag() 20 .and_then(|subtag| subtag.as_str().parse().ok().map(Self)) 21 .ok_or(PreferencesParseError::InvalidKeywordValue) 22 }, 23 |input: RegionOverride| { 24 Value::from_subtag(Some(input.0.into_subtag())) 25 } 26 ); 27 28 #[cfg(test)] 29 mod test { 30 use super::*; 31 use crate::extensions::unicode; 32 use crate::extensions::unicode::subdivision_suffix; 33 use crate::subtags::region; 34 35 #[test] region_override_test()36 fn region_override_test() { 37 let val = unicode::value!("uksct"); 38 let rg: RegionOverride = val.try_into().unwrap(); 39 assert_eq!(rg.0.region, region!("UK")); 40 assert_eq!(rg.0.suffix, subdivision_suffix!("sct")); 41 42 let val = unicode::value!("usca"); 43 let rg: RegionOverride = val.try_into().unwrap(); 44 assert_eq!(rg.0.region, region!("US")); 45 assert_eq!(rg.0.suffix, subdivision_suffix!("ca")); 46 47 let val = unicode::value!("419bel"); 48 let rg: RegionOverride = val.try_into().unwrap(); 49 assert_eq!(rg.0.region, region!("419")); 50 assert_eq!(rg.0.suffix, subdivision_suffix!("bel")); 51 52 let val = unicode::value!("uszzzz"); 53 let rg: RegionOverride = val.try_into().unwrap(); 54 assert_eq!(rg.0.region, region!("us")); 55 assert_eq!(rg.0.suffix, subdivision_suffix!("zzzz")); 56 57 for i in &["4aabel", "a4bel", "ukabcde"] { 58 let val = unicode::Value::try_from_str(i).unwrap(); 59 let rg: Result<RegionOverride, _> = val.try_into(); 60 assert!(rg.is_err()); 61 } 62 } 63 } 64