icu_locale_core/parser/
locale.rs

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
5use crate::extensions;
6use crate::parser::{ParseError, ParserMode, SubtagIterator};
7use crate::subtags::{self, Subtag};
8#[cfg(feature = "alloc")]
9use crate::Locale;
10
11use super::parse_locale_with_single_variant_single_keyword_unicode_extension_from_iter;
12
13#[cfg(feature = "alloc")]
14pub fn parse_locale(t: &[u8]) -> Result<Locale, ParseError> {
15    let mut iter = SubtagIterator::new(t);
16
17    let id = super::parse_language_identifier_from_iter(&mut iter, ParserMode::Locale)?;
18    let extensions = if iter.peek().is_some() {
19        extensions::Extensions::try_from_iter(&mut iter)?
20    } else {
21        extensions::Extensions::default()
22    };
23    Ok(Locale { id, extensions })
24}
25
26#[allow(clippy::type_complexity)]
27pub 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<Subtag>)>,
37    ),
38    ParseError,
39> {
40    let iter = SubtagIterator::new(t);
41    parse_locale_with_single_variant_single_keyword_unicode_extension_from_iter(iter, mode)
42}