#[diplomat::bridge]
pub mod ffi {
use crate::{errors::ffi::ICU4XError, provider::ffi::ICU4XDataProvider};
use alloc::boxed::Box;
use icu_normalizer::properties::{
CanonicalCombiningClassMap, CanonicalComposition, CanonicalDecomposition, Decomposed,
};
#[diplomat::opaque]
#[diplomat::rust_link(icu::normalizer::properties::CanonicalCombiningClassMap, Struct)]
pub struct ICU4XCanonicalCombiningClassMap(pub CanonicalCombiningClassMap);
impl ICU4XCanonicalCombiningClassMap {
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalCombiningClassMap::try_new_unstable,
FnInStruct
)]
pub fn create(
provider: &ICU4XDataProvider,
) -> Result<Box<ICU4XCanonicalCombiningClassMap>, ICU4XError> {
Ok(Box::new(ICU4XCanonicalCombiningClassMap(
CanonicalCombiningClassMap::try_new_unstable(&provider.0)?,
)))
}
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalCombiningClassMap::get,
FnInStruct
)]
#[diplomat::rust_link(
icu::properties::properties::CanonicalCombiningClass,
Struct,
compact
)]
pub fn get(&self, ch: char) -> u8 {
self.0.get(ch).0
}
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalCombiningClassMap::get32,
FnInStruct
)]
#[diplomat::rust_link(
icu::properties::properties::CanonicalCombiningClass,
Struct,
compact
)]
pub fn get32(&self, ch: u32) -> u8 {
self.0.get32(ch).0
}
}
#[diplomat::opaque]
#[diplomat::rust_link(icu::normalizer::properties::CanonicalComposition, Struct)]
pub struct ICU4XCanonicalComposition(pub CanonicalComposition);
impl ICU4XCanonicalComposition {
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalComposition::try_new_unstable,
FnInStruct
)]
pub fn create(
provider: &ICU4XDataProvider,
) -> Result<Box<ICU4XCanonicalComposition>, ICU4XError> {
Ok(Box::new(ICU4XCanonicalComposition(
CanonicalComposition::try_new_unstable(&provider.0)?,
)))
}
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalComposition::compose,
FnInStruct
)]
pub fn compose(&self, starter: char, second: char) -> char {
self.0.compose(starter, second).unwrap_or('\0')
}
}
#[diplomat::rust_link(icu::normalizer::properties::Decomposed, Enum)]
pub struct ICU4XDecomposed {
first: char,
second: char,
}
#[diplomat::opaque]
#[diplomat::rust_link(icu::normalizer::properties::CanonicalDecomposition, Struct)]
pub struct ICU4XCanonicalDecomposition(pub CanonicalDecomposition);
impl ICU4XCanonicalDecomposition {
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalDecomposition::try_new_unstable,
FnInStruct
)]
pub fn create(
provider: &ICU4XDataProvider,
) -> Result<Box<ICU4XCanonicalDecomposition>, ICU4XError> {
Ok(Box::new(ICU4XCanonicalDecomposition(
CanonicalDecomposition::try_new_unstable(&provider.0)?,
)))
}
#[diplomat::rust_link(
icu::normalizer::properties::CanonicalDecomposition::decompose,
FnInStruct
)]
pub fn decompose(&self, c: char) -> ICU4XDecomposed {
match self.0.decompose(c) {
Decomposed::Default => ICU4XDecomposed {
first: c,
second: '\0',
},
Decomposed::Singleton(s) => ICU4XDecomposed {
first: s,
second: '\0',
},
Decomposed::Expansion(first, second) => ICU4XDecomposed { first, second },
}
}
}
}