#[diplomat::bridge]
pub mod ffi {
use crate::{
errors::ffi::ICU4XError, locale::ffi::ICU4XLocale, provider::ffi::ICU4XDataProvider,
};
use alloc::boxed::Box;
use alloc::string::String;
use alloc::vec::Vec;
use icu_list::{ListFormatter, ListLength};
use writeable::Writeable;
#[diplomat::opaque]
#[diplomat::attr(*, disable)]
pub struct ICU4XList(pub Vec<String>);
impl ICU4XList {
#[diplomat::attr(all(supports = constructors, supports = fallible_constructors), constructor)]
pub fn create() -> Box<ICU4XList> {
Box::new(ICU4XList(Vec::new()))
}
#[diplomat::attr(all(supports = constructors, supports = fallible_constructors, supports = named_constructors), named_constructor = "with_capacity")]
pub fn create_with_capacity(capacity: usize) -> Box<ICU4XList> {
Box::new(ICU4XList(Vec::with_capacity(capacity)))
}
pub fn push(&mut self, val: &DiplomatStr) {
self.0.push(String::from_utf8_lossy(val).into_owned());
}
#[diplomat::attr(supports = accessors, getter = "length")]
pub fn len(&self) -> usize {
self.0.len()
}
#[diplomat::attr(supports = accessors, getter)]
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
#[diplomat::rust_link(icu::list::ListLength, Enum)]
#[diplomat::enum_convert(ListLength, needs_wildcard)]
pub enum ICU4XListLength {
Wide,
Short,
Narrow,
}
#[diplomat::opaque]
#[diplomat::rust_link(icu::list::ListFormatter, Struct)]
pub struct ICU4XListFormatter(pub ListFormatter);
impl ICU4XListFormatter {
#[diplomat::rust_link(icu::list::ListFormatter::try_new_and_with_length, FnInStruct)]
#[diplomat::attr(all(supports = constructors, supports = fallible_constructors, supports = named_constructors), named_constructor = "and_with_length")]
pub fn create_and_with_length(
provider: &ICU4XDataProvider,
locale: &ICU4XLocale,
length: ICU4XListLength,
) -> Result<Box<ICU4XListFormatter>, ICU4XError> {
let locale = locale.to_datalocale();
Ok(Box::new(ICU4XListFormatter(call_constructor!(
ListFormatter::try_new_and_with_length,
ListFormatter::try_new_and_with_length_with_any_provider,
ListFormatter::try_new_and_with_length_with_buffer_provider,
provider,
&locale,
length.into()
)?)))
}
#[diplomat::rust_link(icu::list::ListFormatter::try_new_or_with_length, FnInStruct)]
#[diplomat::attr(all(supports = constructors, supports = fallible_constructors, supports = named_constructors), named_constructor = "or_with_length")]
pub fn create_or_with_length(
provider: &ICU4XDataProvider,
locale: &ICU4XLocale,
length: ICU4XListLength,
) -> Result<Box<ICU4XListFormatter>, ICU4XError> {
let locale = locale.to_datalocale();
Ok(Box::new(ICU4XListFormatter(call_constructor!(
ListFormatter::try_new_or_with_length,
ListFormatter::try_new_or_with_length_with_any_provider,
ListFormatter::try_new_or_with_length_with_buffer_provider,
provider,
&locale,
length.into()
)?)))
}
#[diplomat::rust_link(icu::list::ListFormatter::try_new_unit_with_length, FnInStruct)]
#[diplomat::attr(all(supports = constructors, supports = fallible_constructors, supports = named_constructors), named_constructor = "unit_with_length")]
pub fn create_unit_with_length(
provider: &ICU4XDataProvider,
locale: &ICU4XLocale,
length: ICU4XListLength,
) -> Result<Box<ICU4XListFormatter>, ICU4XError> {
let locale = locale.to_datalocale();
Ok(Box::new(ICU4XListFormatter(call_constructor!(
ListFormatter::try_new_unit_with_length,
ListFormatter::try_new_unit_with_length_with_any_provider,
ListFormatter::try_new_unit_with_length_with_buffer_provider,
provider,
&locale,
length.into()
)?)))
}
#[diplomat::rust_link(icu::list::ListFormatter::format, FnInStruct)]
#[diplomat::rust_link(icu::list::ListFormatter::format_to_string, FnInStruct, hidden)]
#[diplomat::rust_link(icu::list::FormattedList, Struct, hidden)]
#[diplomat::attr(*, disable)]
pub fn format(
&self,
list: &ICU4XList,
write: &mut DiplomatWriteable,
) -> Result<(), ICU4XError> {
self.0.format(list.0.iter()).write_to(write)?;
Ok(())
}
#[diplomat::rust_link(icu::list::ListFormatter::format, FnInStruct)]
#[diplomat::rust_link(icu::list::ListFormatter::format_to_string, FnInStruct, hidden)]
#[diplomat::rust_link(icu::list::FormattedList, Struct, hidden)]
#[diplomat::attr(dart, disable)]
#[diplomat::skip_if_ast]
pub fn format_valid_utf8(
&self,
list: &[&str],
write: &mut DiplomatWriteable,
) -> Result<(), ICU4XError> {
self.0.format(list.iter()).write_to(write)?;
Ok(())
}
#[diplomat::rust_link(icu::list::ListFormatter::format, FnInStruct)]
#[diplomat::rust_link(icu::list::ListFormatter::format_to_string, FnInStruct, hidden)]
#[diplomat::rust_link(icu::list::FormattedList, Struct, hidden)]
#[diplomat::attr(dart, disable)]
#[diplomat::skip_if_ast]
pub fn format_utf8(
&self,
list: &[&DiplomatStr],
write: &mut DiplomatWriteable,
) -> Result<(), ICU4XError> {
self.0
.format(
list.iter()
.copied()
.map(crate::utf::PotentiallyInvalidUtf8)
.map(crate::utf::LossyWrap),
)
.write_to(write)?;
Ok(())
}
#[diplomat::rust_link(icu::list::ListFormatter::format, FnInStruct)]
#[diplomat::rust_link(icu::list::ListFormatter::format_to_string, FnInStruct, hidden)]
#[diplomat::rust_link(icu::list::FormattedList, Struct, hidden)]
#[diplomat::attr(dart, rename = "format")]
#[diplomat::skip_if_ast]
pub fn format_utf16(
&self,
list: &[&DiplomatStr16],
write: &mut DiplomatWriteable,
) -> Result<(), ICU4XError> {
self.0
.format(
list.iter()
.copied()
.map(crate::utf::PotentiallyInvalidUtf16)
.map(crate::utf::LossyWrap),
)
.write_to(write)?;
Ok(())
}
}
}