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::properties_iter::ffi::CodePointRangeIterator; 12 use crate::properties_sets::ffi::CodePointSetData; 13 #[cfg(feature = "buffer_provider")] 14 use crate::{errors::ffi::DataError, provider::ffi::DataProvider}; 15 16 #[diplomat::opaque] 17 /// An ICU4X ScriptWithExtensions map object, capable of holding a map of codepoints to scriptextensions values 18 #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions, Struct)] 19 pub struct ScriptWithExtensions(pub icu_properties::script::ScriptWithExtensions); 20 21 #[diplomat::opaque] 22 /// A slightly faster ScriptWithExtensions object 23 #[diplomat::rust_link(icu::properties::script::ScriptWithExtensionsBorrowed, Struct)] 24 pub struct ScriptWithExtensionsBorrowed<'a>( 25 pub icu_properties::script::ScriptWithExtensionsBorrowed<'a>, 26 ); 27 #[diplomat::opaque] 28 /// An object that represents the Script_Extensions property for a single character 29 #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet, Struct)] 30 pub struct ScriptExtensionsSet<'a>(pub icu_properties::script::ScriptExtensionsSet<'a>); 31 32 impl ScriptWithExtensions { 33 /// Create a map for the `Script`/`Script_Extensions` properties, using compiled data. 34 #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions::new, FnInStruct)] 35 #[diplomat::rust_link( 36 icu::properties::script::ScriptWithExtensionsBorrowed::new, 37 FnInStruct, 38 hidden 39 )] 40 #[diplomat::attr(auto, constructor)] 41 #[cfg(feature = "compiled_data")] create() -> Box<ScriptWithExtensions>42 pub fn create() -> Box<ScriptWithExtensions> { 43 Box::new(ScriptWithExtensions( 44 icu_properties::script::ScriptWithExtensions::new().static_to_owned(), 45 )) 46 } 47 48 /// Create a map for the `Script`/`Script_Extensions` properties, using compiled data. 49 #[diplomat::rust_link(icu::properties::script::ScriptWithExtensions::new, FnInStruct)] 50 #[diplomat::rust_link( 51 icu::properties::script::ScriptWithExtensionsBorrowed::new, 52 FnInStruct, 53 hidden 54 )] 55 #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")] 56 #[cfg(feature = "buffer_provider")] create_with_provider( provider: &DataProvider, ) -> Result<Box<ScriptWithExtensions>, DataError>57 pub fn create_with_provider( 58 provider: &DataProvider, 59 ) -> Result<Box<ScriptWithExtensions>, DataError> { 60 Ok(Box::new(ScriptWithExtensions( 61 icu_properties::script::ScriptWithExtensions::try_new_with_buffer_provider( 62 provider.get()?, 63 )?, 64 ))) 65 } 66 67 /// Get the Script property value for a code point 68 #[diplomat::rust_link( 69 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val, 70 FnInStruct 71 )] 72 #[diplomat::rust_link( 73 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val32, 74 FnInStruct, 75 hidden 76 )] get_script_val(&self, ch: DiplomatChar) -> u1677 pub fn get_script_val(&self, ch: DiplomatChar) -> u16 { 78 self.0.as_borrowed().get_script_val32(ch).to_icu4c_value() 79 } 80 81 /// Check if the Script_Extensions property of the given code point covers the given script 82 #[diplomat::rust_link( 83 icu::properties::script::ScriptWithExtensionsBorrowed::has_script, 84 FnInStruct 85 )] 86 #[diplomat::rust_link( 87 icu::properties::script::ScriptWithExtensionsBorrowed::has_script32, 88 FnInStruct, 89 hidden 90 )] has_script(&self, ch: DiplomatChar, script: u16) -> bool91 pub fn has_script(&self, ch: DiplomatChar, script: u16) -> bool { 92 self.0 93 .as_borrowed() 94 .has_script32(ch, icu_properties::props::Script::from_icu4c_value(script)) 95 } 96 97 /// Borrow this object for a slightly faster variant with more operations 98 #[diplomat::rust_link( 99 icu::properties::script::ScriptWithExtensions::as_borrowed, 100 FnInStruct 101 )] 102 #[diplomat::attr(auto, getter)] as_borrowed<'a>(&'a self) -> Box<ScriptWithExtensionsBorrowed<'a>>103 pub fn as_borrowed<'a>(&'a self) -> Box<ScriptWithExtensionsBorrowed<'a>> { 104 Box::new(ScriptWithExtensionsBorrowed(self.0.as_borrowed())) 105 } 106 107 /// Get a list of ranges of code points that contain this script in their Script_Extensions values 108 #[diplomat::rust_link( 109 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_ranges, 110 FnInStruct 111 )] iter_ranges_for_script<'a>( &'a self, script: u16, ) -> Box<CodePointRangeIterator<'a>>112 pub fn iter_ranges_for_script<'a>( 113 &'a self, 114 script: u16, 115 ) -> Box<CodePointRangeIterator<'a>> { 116 Box::new(CodePointRangeIterator(Box::new( 117 self.0.as_borrowed().get_script_extensions_ranges( 118 icu_properties::props::Script::from_icu4c_value(script), 119 ), 120 ))) 121 } 122 } 123 124 impl<'a> ScriptWithExtensionsBorrowed<'a> { 125 /// Get the Script property value for a code point 126 #[diplomat::rust_link( 127 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val, 128 FnInStruct 129 )] 130 /// Get the Script property value for a code point 131 #[diplomat::rust_link( 132 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_val32, 133 FnInStruct, 134 hidden 135 )] get_script_val(&self, ch: DiplomatChar) -> u16136 pub fn get_script_val(&self, ch: DiplomatChar) -> u16 { 137 self.0.get_script_val32(ch).to_icu4c_value() 138 } 139 /// Get the Script property value for a code point 140 #[diplomat::rust_link( 141 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_val, 142 FnInStruct 143 )] 144 #[diplomat::rust_link( 145 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_val32, 146 FnInStruct, 147 hidden 148 )] get_script_extensions_val(&self, ch: DiplomatChar) -> Box<ScriptExtensionsSet<'a>>149 pub fn get_script_extensions_val(&self, ch: DiplomatChar) -> Box<ScriptExtensionsSet<'a>> { 150 Box::new(ScriptExtensionsSet(self.0.get_script_extensions_val32(ch))) 151 } 152 /// Check if the Script_Extensions property of the given code point covers the given script 153 #[diplomat::rust_link( 154 icu::properties::script::ScriptWithExtensionsBorrowed::has_script, 155 FnInStruct 156 )] 157 #[diplomat::rust_link( 158 icu::properties::script::ScriptWithExtensionsBorrowed::has_script32, 159 FnInStruct, 160 hidden 161 )] has_script(&self, ch: DiplomatChar, script: u16) -> bool162 pub fn has_script(&self, ch: DiplomatChar, script: u16) -> bool { 163 self.0 164 .has_script32(ch, icu_properties::props::Script::from_icu4c_value(script)) 165 } 166 167 /// Build the CodePointSetData corresponding to a codepoints matching a particular script 168 /// in their Script_Extensions 169 #[diplomat::rust_link( 170 icu::properties::script::ScriptWithExtensionsBorrowed::get_script_extensions_set, 171 FnInStruct 172 )] get_script_extensions_set(&self, script: u16) -> Box<CodePointSetData>173 pub fn get_script_extensions_set(&self, script: u16) -> Box<CodePointSetData> { 174 let list = self 175 .0 176 .get_script_extensions_set(icu_properties::props::Script::from_icu4c_value(script)) 177 .into_owned(); 178 let set = icu_properties::CodePointSetData::from_code_point_inversion_list(list); 179 Box::new(CodePointSetData(set)) 180 } 181 } 182 impl<'a> ScriptExtensionsSet<'a> { 183 /// Check if the Script_Extensions property of the given code point covers the given script 184 #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::contains, FnInStruct)] contains(&self, script: u16) -> bool185 pub fn contains(&self, script: u16) -> bool { 186 self.0 187 .contains(&icu_properties::props::Script::from_icu4c_value(script)) 188 } 189 190 /// Get the number of scripts contained in here 191 #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::iter, FnInStruct)] 192 #[diplomat::attr(auto, getter)] count(&self) -> usize193 pub fn count(&self) -> usize { 194 self.0.array_len() 195 } 196 197 /// Get script at index 198 #[diplomat::rust_link(icu::properties::script::ScriptExtensionsSet::iter, FnInStruct)] script_at(&self, index: usize) -> Option<u16>199 pub fn script_at(&self, index: usize) -> Option<u16> { 200 self.0.array_get(index).map(|x| x.to_icu4c_value()) 201 } 202 } 203 } 204