// This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). #[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, }; /// Lookup of the Canonical_Combining_Class Unicode property #[diplomat::opaque] #[diplomat::rust_link(icu::normalizer::properties::CanonicalCombiningClassMap, Struct)] pub struct ICU4XCanonicalCombiningClassMap(pub CanonicalCombiningClassMap); impl ICU4XCanonicalCombiningClassMap { /// Construct a new ICU4XCanonicalCombiningClassMap instance for NFC #[diplomat::rust_link( icu::normalizer::properties::CanonicalCombiningClassMap::new, FnInStruct )] pub fn create( provider: &ICU4XDataProvider, ) -> Result, ICU4XError> { Ok(Box::new(ICU4XCanonicalCombiningClassMap( call_constructor!( CanonicalCombiningClassMap::new [r => Ok(r)], CanonicalCombiningClassMap::try_new_with_any_provider, CanonicalCombiningClassMap::try_new_with_buffer_provider, provider )?, ))) } #[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 } } /// The raw canonical composition operation. /// /// Callers should generally use ICU4XComposingNormalizer unless they specifically need raw composition operations #[diplomat::opaque] #[diplomat::rust_link(icu::normalizer::properties::CanonicalComposition, Struct)] pub struct ICU4XCanonicalComposition(pub CanonicalComposition); impl ICU4XCanonicalComposition { /// Construct a new ICU4XCanonicalComposition instance for NFC #[diplomat::rust_link(icu::normalizer::properties::CanonicalComposition::new, FnInStruct)] pub fn create( provider: &ICU4XDataProvider, ) -> Result, ICU4XError> { Ok(Box::new(ICU4XCanonicalComposition(call_constructor!( CanonicalComposition::new [r => Ok(r)], CanonicalComposition::try_new_with_any_provider, CanonicalComposition::try_new_with_buffer_provider, provider, )?))) } /// Performs canonical composition (including Hangul) on a pair of characters /// or returns NUL if these characters don’t compose. Composition exclusions are taken into account. #[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') } } /// The outcome of non-recursive canonical decomposition of a character. /// `second` will be NUL when the decomposition expands to a single character /// (which may or may not be the original one) #[diplomat::rust_link(icu::normalizer::properties::Decomposed, Enum)] pub struct ICU4XDecomposed { first: char, second: char, } /// The raw (non-recursive) canonical decomposition operation. /// /// Callers should generally use ICU4XDecomposingNormalizer unless they specifically need raw composition operations #[diplomat::opaque] #[diplomat::rust_link(icu::normalizer::properties::CanonicalDecomposition, Struct)] pub struct ICU4XCanonicalDecomposition(pub CanonicalDecomposition); impl ICU4XCanonicalDecomposition { /// Construct a new ICU4XCanonicalDecomposition instance for NFC #[diplomat::rust_link(icu::normalizer::properties::CanonicalDecomposition::new, FnInStruct)] pub fn create( provider: &ICU4XDataProvider, ) -> Result, ICU4XError> { Ok(Box::new(ICU4XCanonicalDecomposition(call_constructor!( CanonicalDecomposition::new [r => Ok(r)], CanonicalDecomposition::try_new_with_any_provider, CanonicalDecomposition::try_new_with_buffer_provider, provider, )?))) } /// Performs non-recursive canonical decomposition (including for Hangul). #[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 }, } } } }