#[diplomat::bridge]
#[diplomat::abi_rename = "icu4x_{0}_mv1"]
#[diplomat::attr(auto, namespace = "icu4x")]
pub mod ffi {
use alloc::boxed::Box;
use crate::{errors::ffi::DataError, locale_core::ffi::Locale, provider::ffi::DataProvider};
use diplomat_runtime::DiplomatOption;
#[diplomat::opaque]
#[diplomat::rust_link(icu::collator::Collator, Struct)]
#[diplomat::rust_link(icu::collator::CollatorBorrowed, Struct, hidden)]
pub struct Collator(pub icu_collator::Collator);
#[diplomat::rust_link(icu::collator::CollatorOptions, Struct)]
#[diplomat::rust_link(icu::collator::CollatorOptions::default, FnInStruct, hidden)]
#[diplomat::attr(supports = non_exhaustive_structs, rename = "CollatorOptions")]
pub struct CollatorOptionsV1 {
pub strength: DiplomatOption<CollatorStrength>,
pub alternate_handling: DiplomatOption<CollatorAlternateHandling>,
pub case_first: DiplomatOption<CollatorCaseFirst>,
pub max_variable: DiplomatOption<CollatorMaxVariable>,
pub case_level: DiplomatOption<CollatorCaseLevel>,
pub numeric: DiplomatOption<CollatorNumeric>,
pub backward_second_level: DiplomatOption<CollatorBackwardSecondLevel>,
}
#[diplomat::rust_link(icu::collator::ResolvedCollatorOptions, Struct)]
#[diplomat::out]
#[diplomat::attr(supports = non_exhaustive_structs, rename = "CollatorResolvedOptions")]
pub struct CollatorResolvedOptionsV1 {
pub strength: CollatorStrength,
pub alternate_handling: CollatorAlternateHandling,
pub case_first: CollatorCaseFirst,
pub max_variable: CollatorMaxVariable,
pub case_level: CollatorCaseLevel,
pub numeric: CollatorNumeric,
pub backward_second_level: CollatorBackwardSecondLevel,
}
#[diplomat::rust_link(icu::collator::Strength, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::Strength, needs_wildcard)]
pub enum CollatorStrength {
Primary = 0,
Secondary = 1,
Tertiary = 2,
Quaternary = 3,
Identical = 4,
}
#[diplomat::rust_link(icu::collator::AlternateHandling, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::AlternateHandling, needs_wildcard)]
pub enum CollatorAlternateHandling {
NonIgnorable = 0,
Shifted = 1,
}
#[diplomat::rust_link(icu::collator::CaseFirst, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::CaseFirst, needs_wildcard)]
pub enum CollatorCaseFirst {
Off = 0,
LowerFirst = 1,
UpperFirst = 2,
}
#[diplomat::rust_link(icu::collator::MaxVariable, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::MaxVariable, needs_wildcard)]
pub enum CollatorMaxVariable {
Space = 0,
Punctuation = 1,
Symbol = 2,
Currency = 3,
}
#[diplomat::rust_link(icu::collator::CaseLevel, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::CaseLevel, needs_wildcard)]
pub enum CollatorCaseLevel {
Off = 0,
On = 1,
}
#[diplomat::rust_link(icu::collator::Numeric, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::Numeric, needs_wildcard)]
pub enum CollatorNumeric {
Off = 0,
On = 1,
}
#[diplomat::rust_link(icu::collator::BackwardSecondLevel, Enum)]
#[derive(Eq, PartialEq, Debug, PartialOrd, Ord)]
#[diplomat::enum_convert(icu_collator::BackwardSecondLevel, needs_wildcard)]
pub enum CollatorBackwardSecondLevel {
Off = 0,
On = 1,
}
impl Collator {
#[diplomat::rust_link(icu::collator::Collator::try_new, FnInStruct)]
#[diplomat::rust_link(icu::collator::CollatorBorrowed::try_new, FnInStruct, hidden)]
#[diplomat::rust_link(icu::collator::CollatorPreferences, Struct, hidden)]
#[diplomat::attr(supports = fallible_constructors, constructor)]
#[diplomat::attr(supports = non_exhaustive_structs, rename = "create")]
pub fn create_v1(
provider: &DataProvider,
locale: &Locale,
options: CollatorOptionsV1,
) -> Result<Box<Collator>, DataError> {
Ok(Box::new(Collator(call_constructor!(
icu_collator::Collator::try_new [r => Ok(r?.static_to_owned())],
icu_collator::Collator::try_new_with_any_provider,
icu_collator::Collator::try_new_with_buffer_provider,
provider,
icu_collator::CollatorPreferences::from(&locale.0),
icu_collator::CollatorOptions::from(options),
)?)))
}
#[diplomat::rust_link(icu::collator::CollatorBorrowed::compare_utf8, FnInStruct)]
#[diplomat::rust_link(icu::collator::CollatorBorrowed::compare, FnInStruct, hidden)]
#[diplomat::attr(not(supports = utf8_strings), disable)]
#[diplomat::attr(supports = utf8_strings, rename = "compare")]
pub fn compare_utf8(&self, left: &DiplomatStr, right: &DiplomatStr) -> core::cmp::Ordering {
self.0.as_borrowed().compare_utf8(left, right)
}
#[diplomat::rust_link(icu::collator::CollatorBorrowed::compare_utf16, FnInStruct)]
#[diplomat::attr(not(supports = utf8_strings), rename = "compare")]
#[diplomat::attr(supports = utf8_strings, rename = "compare16")]
pub fn compare_utf16(
&self,
left: &DiplomatStr16,
right: &DiplomatStr16,
) -> core::cmp::Ordering {
self.0.as_borrowed().compare_utf16(left, right)
}
#[diplomat::rust_link(icu::collator::CollatorBorrowed::resolved_options, FnInStruct)]
#[diplomat::attr(auto, getter)]
#[diplomat::attr(supports = non_exhaustive_structs, rename = "resolved_options")]
pub fn resolved_options_v1(&self) -> CollatorResolvedOptionsV1 {
self.0.as_borrowed().resolved_options().into()
}
}
}
impl From<ffi::CollatorOptionsV1> for icu_collator::CollatorOptions {
fn from(options: ffi::CollatorOptionsV1) -> icu_collator::CollatorOptions {
let mut result = icu_collator::CollatorOptions::default();
result.strength = options.strength.into_converted_option();
result.alternate_handling = options.alternate_handling.into_converted_option();
result.case_first = options.case_first.into_converted_option();
result.max_variable = options.max_variable.into_converted_option();
result.case_level = options.case_level.into_converted_option();
result.numeric = options.numeric.into_converted_option();
result.backward_second_level = options.backward_second_level.into_converted_option();
result
}
}
impl From<icu_collator::ResolvedCollatorOptions> for ffi::CollatorResolvedOptionsV1 {
fn from(options: icu_collator::ResolvedCollatorOptions) -> ffi::CollatorResolvedOptionsV1 {
Self {
strength: options.strength.into(),
alternate_handling: options.alternate_handling.into(),
case_first: options.case_first.into(),
max_variable: options.max_variable.into(),
case_level: options.case_level.into(),
numeric: options.numeric.into(),
backward_second_level: options.backward_second_level.into(),
}
}
}