use crate::provider::{CaseMapUnfold, CaseMapUnfoldV1, CaseMapV1};
use crate::set::ClosureSink;
use crate::{CaseMapper, CaseMapperBorrowed};
use icu_provider::prelude::*;
#[derive(Clone, Debug)]
pub struct CaseMapCloser<CM> {
cm: CM,
unfold: DataPayload<CaseMapUnfoldV1>,
}
impl CaseMapCloser<CaseMapper> {
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<CaseMapV1> + DataProvider<CaseMapUnfoldV1> + ?Sized,
{
let cm = CaseMapper::try_new_unstable(provider)?;
let unfold = provider.load(Default::default())?.payload;
Ok(Self { cm, unfold })
}
}
impl CaseMapCloser<CaseMapper> {
#[cfg(feature = "compiled_data")]
#[expect(clippy::new_ret_no_self)] pub const fn new() -> CaseMapCloserBorrowed<'static> {
CaseMapCloserBorrowed::new()
}
}
impl<CM: AsRef<CaseMapper>> CaseMapCloser<CM> {
icu_provider::gen_buffer_data_constructors!((casemapper: CM) -> error: DataError,
functions: [
new_with_mapper: skip,
try_new_with_mapper_with_buffer_provider,
try_new_with_mapper_unstable,
Self,
]);
#[cfg(feature = "compiled_data")]
pub const fn new_with_mapper(casemapper: CM) -> Self {
Self {
cm: casemapper,
unfold: DataPayload::from_static_ref(
crate::provider::Baked::SINGLETON_CASE_MAP_UNFOLD_V1,
),
}
}
#[doc = icu_provider::gen_buffer_unstable_docs!(UNSTABLE, Self::new_with_mapper)]
pub fn try_new_with_mapper_unstable<P>(provider: &P, casemapper: CM) -> Result<Self, DataError>
where
P: DataProvider<CaseMapV1> + DataProvider<CaseMapUnfoldV1> + ?Sized,
{
let unfold = provider.load(Default::default())?.payload;
Ok(Self {
cm: casemapper,
unfold,
})
}
pub fn as_borrowed(&self) -> CaseMapCloserBorrowed<'_> {
CaseMapCloserBorrowed {
cm: self.cm.as_ref().as_borrowed(),
unfold: self.unfold.get(),
}
}
}
#[derive(Clone, Debug, Copy)]
pub struct CaseMapCloserBorrowed<'a> {
cm: CaseMapperBorrowed<'a>,
unfold: &'a CaseMapUnfold<'a>,
}
impl CaseMapCloserBorrowed<'static> {
#[cfg(feature = "compiled_data")]
pub const fn new() -> CaseMapCloserBorrowed<'static> {
CaseMapCloserBorrowed {
cm: CaseMapper::new(),
unfold: crate::provider::Baked::SINGLETON_CASE_MAP_UNFOLD_V1,
}
}
pub const fn static_to_owned(self) -> CaseMapCloser<CaseMapper> {
CaseMapCloser {
cm: self.cm.static_to_owned(),
unfold: DataPayload::from_static_ref(self.unfold),
}
}
}
#[cfg(feature = "compiled_data")]
impl Default for CaseMapCloserBorrowed<'static> {
fn default() -> Self {
Self::new()
}
}
impl CaseMapCloserBorrowed<'_> {
pub fn add_case_closure_to<S: ClosureSink>(self, c: char, set: &mut S) {
self.cm.add_case_closure_to(c, set);
}
pub fn add_string_case_closure_to<S: ClosureSink>(self, s: &str, set: &mut S) -> bool {
self.cm.data.add_string_case_closure_to(s, set, self.unfold)
}
}