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::{extensions::unicode::Value, subtags::Subtag}; 8 use tinystr::TinyAsciiStr; 9 10 struct_keyword!( 11 /// A Unicode Currency Identifier defines a type of currency. 12 /// 13 /// The valid values are listed in [LDML](https://unicode.org/reports/tr35/#UnicodeCurrencyIdentifier). 14 CurrencyType, 15 "cu", 16 TinyAsciiStr<3>, 17 |input: Value| { 18 if let Some(subtag) = input.into_single_subtag() { 19 let ts = subtag.as_tinystr(); 20 if ts.len() == 3 && ts.is_ascii_alphabetic() { 21 return Ok(Self(ts.resize())); 22 } 23 } 24 Err(PreferencesParseError::InvalidKeywordValue) 25 }, 26 |input: CurrencyType| { 27 crate::extensions::unicode::Value::from_subtag(Some( 28 Subtag::from_tinystr_unvalidated(input.0.resize()), 29 )) 30 } 31 ); 32