| 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 tinystr::TinyAsciiStr; |
| 6 | |
| 7 | use crate::extensions::{self, Extensions}; |
| 8 | use crate::parser::errors::ParserError; |
| 9 | use crate::parser::{parse_language_identifier_from_iter, ParserMode, SubtagIterator}; |
| 10 | use crate::{subtags, Locale}; |
| 11 | |
| 12 | use super::parse_locale_with_single_variant_single_keyword_unicode_extension_from_iter; |
| 13 | |
| 14 | pub fn parse_locale(t: &[u8]) -> Result<Locale, ParserError> { |
| 15 | let mut iter: SubtagIterator<'_> = SubtagIterator::new(slice:t); |
| 16 | |
| 17 | let id: LanguageIdentifier = parse_language_identifier_from_iter(&mut iter, mode:ParserMode::Locale)?; |
| 18 | let extensions: Extensions = if iter.peek().is_some() { |
| 19 | Extensions::try_from_iter(&mut iter)? |
| 20 | } else { |
| 21 | Extensions::default() |
| 22 | }; |
| 23 | Ok(Locale { id, extensions }) |
| 24 | } |
| 25 | |
| 26 | #[allow (clippy::type_complexity)] |
| 27 | pub const fn parse_locale_with_single_variant_single_keyword_unicode_keyword_extension( |
| 28 | t: &[u8], |
| 29 | mode: ParserMode, |
| 30 | ) -> Result< |
| 31 | ( |
| 32 | subtags::Language, |
| 33 | Option<subtags::Script>, |
| 34 | Option<subtags::Region>, |
| 35 | Option<subtags::Variant>, |
| 36 | Option<(extensions::unicode::Key, Option<TinyAsciiStr<8>>)>, |
| 37 | ), |
| 38 | ParserError, |
| 39 | > { |
| 40 | let iter: SubtagIterator<'_> = SubtagIterator::new(slice:t); |
| 41 | parse_locale_with_single_variant_single_keyword_unicode_extension_from_iter(iter, mode) |
| 42 | } |
| 43 | |