// 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] #[diplomat::abi_rename = "icu4x_{0}_mv1"] #[diplomat::attr(auto, namespace = "icu4x")] pub mod ffi { use alloc::boxed::Box; #[cfg(feature = "buffer_provider")] use crate::errors::ffi::DataError; #[cfg(feature = "buffer_provider")] use crate::provider::ffi::DataProvider; use crate::locale_core::ffi::Locale; #[diplomat::rust_link(icu::locale::Direction, Enum)] pub enum LocaleDirection { LeftToRight, RightToLeft, Unknown, } #[diplomat::opaque] #[diplomat::rust_link(icu::locale::LocaleDirectionality, Struct)] pub struct LocaleDirectionality(pub icu_locale::LocaleDirectionality); impl LocaleDirectionality { /// Construct a new LocaleDirectionality instance using compiled data. #[diplomat::rust_link(icu::locale::LocaleDirectionality::new_common, FnInStruct)] #[diplomat::attr(supports = constructors, constructor)] #[cfg(feature = "compiled_data")] pub fn create_common() -> Box { Box::new(LocaleDirectionality( icu_locale::LocaleDirectionality::new_common(), )) } /// Construct a new LocaleDirectionality instance using a particular data source. #[diplomat::rust_link(icu::locale::LocaleDirectionality::new_common, FnInStruct)] #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")] #[cfg(feature = "buffer_provider")] pub fn create_common_with_provider( provider: &DataProvider, ) -> Result, DataError> { Ok(Box::new(LocaleDirectionality( icu_locale::LocaleDirectionality::try_new_common_with_buffer_provider( provider.get()?, )?, ))) } /// Construct a new LocaleDirectionality instance using compiled data. #[diplomat::rust_link(icu::locale::LocaleDirectionality::new_extended, FnInStruct)] #[diplomat::rust_link( icu::locale::LocaleDirectionality::new_with_expander, FnInStruct, hidden )] #[diplomat::attr(auto, named_constructor = "extended")] #[cfg(feature = "compiled_data")] pub fn create_extended() -> Box { Box::new(LocaleDirectionality( icu_locale::LocaleDirectionality::new_extended(), )) } /// Construct a new LocaleDirectionality instance using a particular data source. #[diplomat::rust_link(icu::locale::LocaleDirectionality::new_extended, FnInStruct)] #[diplomat::rust_link( icu::locale::LocaleDirectionality::new_with_expander, FnInStruct, hidden )] #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "extended_with_provider")] #[cfg(feature = "buffer_provider")] pub fn create_extended_with_provider( provider: &DataProvider, ) -> Result, DataError> { Ok(Box::new(LocaleDirectionality( icu_locale::LocaleDirectionality::try_new_extended_with_buffer_provider( provider.get()?, )?, ))) } #[diplomat::rust_link(icu::locale::LocaleDirectionality::get, FnInStruct)] #[diplomat::attr(auto, indexer)] pub fn get(&self, locale: &Locale) -> LocaleDirection { match self.0.get(&locale.0.id) { Some(icu_locale::Direction::LeftToRight) => LocaleDirection::LeftToRight, Some(icu_locale::Direction::RightToLeft) => LocaleDirection::RightToLeft, _ => LocaleDirection::Unknown, } } #[diplomat::rust_link(icu::locale::LocaleDirectionality::is_left_to_right, FnInStruct)] pub fn is_left_to_right(&self, locale: &Locale) -> bool { self.0.is_left_to_right(&locale.0.id) } #[diplomat::rust_link(icu::locale::LocaleDirectionality::is_right_to_left, FnInStruct)] pub fn is_right_to_left(&self, locale: &Locale) -> bool { self.0.is_right_to_left(&locale.0.id) } } }