use crate::provider::*;
use icu_locale_core::subtags::*;
use icu_provider::prelude::*;
#[doc(inline)]
pub use icu_provider::fallback::{LocaleFallbackConfig, LocaleFallbackPriority};
mod algorithms;
#[doc(hidden)] #[derive(Debug, Clone, PartialEq)]
pub struct LocaleFallbacker {
likely_subtags: DataPayload<LocaleLikelySubtagsLanguageV1>,
parents: DataPayload<LocaleParentsV1>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LocaleFallbackerBorrowed<'a> {
likely_subtags: &'a LikelySubtagsForLanguage<'a>,
parents: &'a Parents<'a>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct LocaleFallbackerWithConfig<'a> {
likely_subtags: &'a LikelySubtagsForLanguage<'a>,
parents: &'a Parents<'a>,
config: LocaleFallbackConfig,
}
#[derive(Debug)]
struct LocaleFallbackIteratorInner<'a> {
likely_subtags: &'a LikelySubtagsForLanguage<'a>,
parents: &'a Parents<'a>,
config: LocaleFallbackConfig,
backup_subdivision: Option<Subtag>,
backup_variant: Option<Variant>,
backup_region: Option<Region>,
max_script: Option<Script>,
}
#[derive(Debug)]
pub struct LocaleFallbackIterator<'a> {
current: DataLocale,
inner: LocaleFallbackIteratorInner<'a>,
}
impl LocaleFallbacker {
#[cfg(feature = "compiled_data")]
#[allow(clippy::new_ret_no_self)] #[allow(clippy::new_without_default)] pub const fn new<'a>() -> LocaleFallbackerBorrowed<'a> {
unsafe { core::mem::transmute(LocaleFallbackerBorrowed::<'static>::new()) }
}
icu_provider::gen_buffer_data_constructors!(() -> error: DataError,
functions: [
new: skip,
try_new_with_buffer_provider,
try_new_unstable,
Self
]);
#[doc = icu_provider::gen_buffer_unstable_docs!(UNSTABLE, Self::new)]
pub fn try_new_unstable<P>(provider: &P) -> Result<Self, DataError>
where
P: DataProvider<LocaleLikelySubtagsLanguageV1> + DataProvider<LocaleParentsV1> + ?Sized,
{
let likely_subtags = provider.load(Default::default())?.payload;
let parents = provider.load(Default::default())?.payload;
Ok(LocaleFallbacker {
likely_subtags,
parents,
})
}
pub fn new_without_data() -> Self {
LocaleFallbacker {
likely_subtags: DataPayload::from_owned(LikelySubtagsForLanguage {
language: Default::default(),
language_region: Default::default(),
language_script: Default::default(),
und: (
Language::UNKNOWN,
crate::subtags::script!("Zzzz"),
crate::subtags::region!("ZZ"),
),
}),
parents: DataPayload::from_owned(Default::default()),
}
}
#[inline]
pub fn for_config(&self, config: LocaleFallbackConfig) -> LocaleFallbackerWithConfig {
self.as_borrowed().for_config(config)
}
pub fn as_borrowed(&self) -> LocaleFallbackerBorrowed {
LocaleFallbackerBorrowed {
likely_subtags: self.likely_subtags.get(),
parents: self.parents.get(),
}
}
}
impl<'a> LocaleFallbackerBorrowed<'a> {
#[inline]
pub const fn for_config(self, config: LocaleFallbackConfig) -> LocaleFallbackerWithConfig<'a> {
LocaleFallbackerWithConfig {
likely_subtags: self.likely_subtags,
parents: self.parents,
config,
}
}
}
impl LocaleFallbackerBorrowed<'static> {
#[cfg(feature = "compiled_data")]
#[allow(clippy::new_without_default)]
pub const fn new() -> Self {
Self {
likely_subtags: crate::provider::Baked::SINGLETON_LOCALE_LIKELY_SUBTAGS_LANGUAGE_V1,
parents: crate::provider::Baked::SINGLETON_LOCALE_PARENTS_V1,
}
}
pub const fn static_to_owned(self) -> LocaleFallbacker {
LocaleFallbacker {
likely_subtags: DataPayload::from_static_ref(self.likely_subtags),
parents: DataPayload::from_static_ref(self.parents),
}
}
}
impl<'a> LocaleFallbackerWithConfig<'a> {
pub fn fallback_for(&self, mut locale: DataLocale) -> LocaleFallbackIterator<'a> {
let mut default_script = None;
self.normalize(&mut locale, &mut default_script);
let max_script = locale.script.or(default_script);
LocaleFallbackIterator {
current: locale,
inner: LocaleFallbackIteratorInner {
likely_subtags: self.likely_subtags,
parents: self.parents,
config: self.config,
backup_subdivision: None,
backup_variant: None,
backup_region: None,
max_script,
},
}
}
}
impl LocaleFallbackIterator<'_> {
pub fn get(&self) -> &DataLocale {
&self.current
}
pub fn take(self) -> DataLocale {
self.current
}
pub fn step(&mut self) -> &mut Self {
self.inner.step(&mut self.current);
self
}
}