1 // This file is part of ICU4X. For terms of use, please see the file 2 // called LICENSE at the top level of the ICU4X source tree 3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). 4 5 #[diplomat::bridge] 6 #[diplomat::abi_rename = "icu4x_{0}_mv1"] 7 #[diplomat::attr(auto, namespace = "icu4x")] 8 pub mod ffi { 9 use alloc::boxed::Box; 10 11 use crate::locale_core::ffi::Locale; 12 #[cfg(feature = "buffer_provider")] 13 use crate::{errors::ffi::DataError, provider::ffi::DataProvider}; 14 15 #[diplomat::rust_link(icu::locale::TransformResult, Enum)] 16 #[diplomat::enum_convert(icu_locale::TransformResult)] 17 pub enum TransformResult { 18 Modified, 19 Unmodified, 20 } 21 22 /// A locale canonicalizer. 23 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer, Struct)] 24 #[diplomat::opaque] 25 pub struct LocaleCanonicalizer(icu_locale::LocaleCanonicalizer); 26 27 impl LocaleCanonicalizer { 28 /// Create a new [`LocaleCanonicalizer`] using compiled data. 29 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer::new_common, FnInStruct)] 30 #[diplomat::attr(auto, constructor)] 31 #[cfg(feature = "compiled_data")] create_common() -> Box<LocaleCanonicalizer>32 pub fn create_common() -> Box<LocaleCanonicalizer> { 33 Box::new(LocaleCanonicalizer( 34 icu_locale::LocaleCanonicalizer::new_common(), 35 )) 36 } 37 /// Create a new [`LocaleCanonicalizer`]. 38 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer::new_common, FnInStruct)] 39 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")] 40 #[cfg(feature = "buffer_provider")] create_common_with_provider( provider: &DataProvider, ) -> Result<Box<LocaleCanonicalizer>, DataError>41 pub fn create_common_with_provider( 42 provider: &DataProvider, 43 ) -> Result<Box<LocaleCanonicalizer>, DataError> { 44 Ok(Box::new(LocaleCanonicalizer( 45 icu_locale::LocaleCanonicalizer::try_new_common_with_buffer_provider( 46 provider.get()?, 47 )?, 48 ))) 49 } 50 /// Create a new [`LocaleCanonicalizer`] with extended data using compiled data. 51 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer::new_extended, FnInStruct)] 52 #[diplomat::rust_link( 53 icu::locale::LocaleCanonicalizer::new_with_expander, 54 FnInStruct, 55 hidden 56 )] 57 #[diplomat::attr(auto, named_constructor = "extended")] 58 #[cfg(feature = "compiled_data")] create_extended() -> Box<LocaleCanonicalizer>59 pub fn create_extended() -> Box<LocaleCanonicalizer> { 60 Box::new(LocaleCanonicalizer( 61 icu_locale::LocaleCanonicalizer::new_extended(), 62 )) 63 } 64 /// Create a new [`LocaleCanonicalizer`] with extended data. 65 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer::new_extended, FnInStruct)] 66 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "extended_with_provider")] 67 #[cfg(feature = "buffer_provider")] create_extended_with_provider( provider: &DataProvider, ) -> Result<Box<LocaleCanonicalizer>, DataError>68 pub fn create_extended_with_provider( 69 provider: &DataProvider, 70 ) -> Result<Box<LocaleCanonicalizer>, DataError> { 71 Ok(Box::new(LocaleCanonicalizer( 72 icu_locale::LocaleCanonicalizer::try_new_extended_with_buffer_provider( 73 provider.get()?, 74 )?, 75 ))) 76 } 77 #[diplomat::rust_link(icu::locale::LocaleCanonicalizer::canonicalize, FnInStruct)] canonicalize(&self, locale: &mut Locale) -> TransformResult78 pub fn canonicalize(&self, locale: &mut Locale) -> TransformResult { 79 self.0.canonicalize(&mut locale.0).into() 80 } 81 } 82 83 /// A locale expander. 84 #[diplomat::rust_link(icu::locale::LocaleExpander, Struct)] 85 #[diplomat::opaque] 86 pub struct LocaleExpander(pub icu_locale::LocaleExpander); 87 88 impl LocaleExpander { 89 /// Create a new [`LocaleExpander`] using compiled data. 90 #[diplomat::rust_link(icu::locale::LocaleExpander::new_common, FnInStruct)] 91 #[diplomat::attr(auto, constructor)] 92 #[cfg(feature = "compiled_data")] create_common() -> Box<LocaleExpander>93 pub fn create_common() -> Box<LocaleExpander> { 94 Box::new(LocaleExpander(icu_locale::LocaleExpander::new_common())) 95 } 96 /// Create a new [`LocaleExpander`] using a new_common data source. 97 #[diplomat::rust_link(icu::locale::LocaleExpander::new_common, FnInStruct)] 98 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")] 99 #[cfg(feature = "buffer_provider")] create_common_with_provider( provider: &DataProvider, ) -> Result<Box<LocaleExpander>, DataError>100 pub fn create_common_with_provider( 101 provider: &DataProvider, 102 ) -> Result<Box<LocaleExpander>, DataError> { 103 Ok(Box::new(LocaleExpander( 104 icu_locale::LocaleExpander::try_new_common_with_buffer_provider(provider.get()?)?, 105 ))) 106 } 107 /// Create a new [`LocaleExpander`] with extended data using compiled data. 108 #[diplomat::rust_link(icu::locale::LocaleExpander::new_extended, FnInStruct)] 109 #[diplomat::attr(auto, named_constructor = "extended")] 110 #[cfg(feature = "compiled_data")] create_extended() -> Box<LocaleExpander>111 pub fn create_extended() -> Box<LocaleExpander> { 112 Box::new(LocaleExpander(icu_locale::LocaleExpander::new_extended())) 113 } 114 /// Create a new [`LocaleExpander`] with extended data using a particular data source. 115 #[diplomat::rust_link(icu::locale::LocaleExpander::new_extended, FnInStruct)] 116 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "extended_with_provider")] 117 #[cfg(feature = "buffer_provider")] create_extended_with_provider( provider: &DataProvider, ) -> Result<Box<LocaleExpander>, DataError>118 pub fn create_extended_with_provider( 119 provider: &DataProvider, 120 ) -> Result<Box<LocaleExpander>, DataError> { 121 Ok(Box::new(LocaleExpander( 122 icu_locale::LocaleExpander::try_new_extended_with_buffer_provider(provider.get()?)?, 123 ))) 124 } 125 #[diplomat::rust_link(icu::locale::LocaleExpander::maximize, FnInStruct)] maximize(&self, locale: &mut Locale) -> TransformResult126 pub fn maximize(&self, locale: &mut Locale) -> TransformResult { 127 self.0.maximize(&mut locale.0.id).into() 128 } 129 130 #[diplomat::rust_link(icu::locale::LocaleExpander::minimize, FnInStruct)] minimize(&self, locale: &mut Locale) -> TransformResult131 pub fn minimize(&self, locale: &mut Locale) -> TransformResult { 132 self.0.minimize(&mut locale.0.id).into() 133 } 134 135 #[diplomat::rust_link(icu::locale::LocaleExpander::minimize_favor_script, FnInStruct)] minimize_favor_script(&self, locale: &mut Locale) -> TransformResult136 pub fn minimize_favor_script(&self, locale: &mut Locale) -> TransformResult { 137 self.0.minimize_favor_script(&mut locale.0.id).into() 138 } 139 } 140 } 141