icu_locale_core/parser/
locale.rs1use 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}