• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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