/rust/registry/src/index.crates.io-6f17d22bba15001f/icu_capi-1.5.1/src/fallbacker.rs
Line | Count | Source (jump to first uncovered line) |
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 | 0 | #[diplomat::bridge] Unexecuted instantiation: ICU4XLocaleFallbackConfig_destroy Unexecuted instantiation: ICU4XLocaleFallbackIterator_get Unexecuted instantiation: ICU4XLocaleFallbackIterator_step Unexecuted instantiation: ICU4XLocaleFallbackIterator_next Unexecuted instantiation: ICU4XLocaleFallbackIterator_destroy Unexecuted instantiation: ICU4XLocaleFallbackPriority_destroy Unexecuted instantiation: ICU4XLocaleFallbackSupplement_destroy Unexecuted instantiation: ICU4XLocaleFallbacker_create Unexecuted instantiation: ICU4XLocaleFallbacker_create_without_data Unexecuted instantiation: ICU4XLocaleFallbacker_for_config Unexecuted instantiation: ICU4XLocaleFallbacker_destroy Unexecuted instantiation: ICU4XLocaleFallbackerWithConfig_fallback_for_locale Unexecuted instantiation: ICU4XLocaleFallbackerWithConfig_destroy |
6 | | pub mod ffi { |
7 | | use alloc::boxed::Box; |
8 | | use icu_locid_transform::fallback::LocaleFallbackConfig; |
9 | | use icu_locid_transform::fallback::LocaleFallbackIterator; |
10 | | use icu_locid_transform::fallback::LocaleFallbackPriority; |
11 | | use icu_locid_transform::fallback::LocaleFallbackerWithConfig; |
12 | | use icu_locid_transform::LocaleFallbacker; |
13 | | |
14 | | use crate::{ |
15 | | errors::ffi::ICU4XError, locale::ffi::ICU4XLocale, provider::ffi::ICU4XDataProvider, |
16 | | }; |
17 | | |
18 | | /// An object that runs the ICU4X locale fallback algorithm. |
19 | | #[diplomat::opaque] |
20 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbacker, Struct)] |
21 | | #[diplomat::rust_link( |
22 | | icu::locid_transform::fallback::LocaleFallbackerBorrowed, |
23 | | Struct, |
24 | | hidden |
25 | | )] |
26 | | pub struct ICU4XLocaleFallbacker(pub LocaleFallbacker); |
27 | | |
28 | | /// Priority mode for the ICU4X fallback algorithm. |
29 | 0 | #[diplomat::enum_convert(LocaleFallbackPriority, needs_wildcard)] Unexecuted instantiation: <icu_provider::fallback::LocaleFallbackPriority as core::convert::From<icu_capi::fallbacker::ffi::ICU4XLocaleFallbackPriority>>::from Unexecuted instantiation: <icu_capi::fallbacker::ffi::ICU4XLocaleFallbackPriority as core::convert::From<icu_provider::fallback::LocaleFallbackPriority>>::from |
30 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbackPriority, Enum)] |
31 | | #[diplomat::rust_link( |
32 | | icu::locid_transform::fallback::LocaleFallbackPriority::const_default, |
33 | | FnInEnum, |
34 | | hidden |
35 | | )] |
36 | | pub enum ICU4XLocaleFallbackPriority { |
37 | | Language = 0, |
38 | | Region = 1, |
39 | | Collation = 2, |
40 | | } |
41 | | |
42 | | /// What additional data is required to load when performing fallback. |
43 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbackSupplement, Enum)] |
44 | | #[diplomat::rust_link( |
45 | | icu::locid_transform::fallback::LocaleFallbackSupplement::const_default, |
46 | | FnInEnum, |
47 | | hidden |
48 | | )] |
49 | | pub enum ICU4XLocaleFallbackSupplement { |
50 | | None = 0, |
51 | | Collation = 1, |
52 | | } |
53 | | |
54 | | /// Collection of configurations for the ICU4X fallback algorithm. |
55 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbackConfig, Struct)] |
56 | | #[diplomat::rust_link( |
57 | | icu::locid_transform::fallback::LocaleFallbackConfig::const_default, |
58 | | FnInStruct, |
59 | | hidden |
60 | | )] |
61 | | pub struct ICU4XLocaleFallbackConfig<'a> { |
62 | | /// Choice of priority mode. |
63 | | pub priority: ICU4XLocaleFallbackPriority, |
64 | | /// An empty string is considered `None`. |
65 | | pub extension_key: &'a DiplomatStr, |
66 | | /// Fallback supplement data key to customize fallback rules. |
67 | | pub fallback_supplement: ICU4XLocaleFallbackSupplement, |
68 | | } |
69 | | |
70 | | /// An object that runs the ICU4X locale fallback algorithm with specific configurations. |
71 | | #[diplomat::opaque] |
72 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbacker, Struct)] |
73 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbackerWithConfig, Struct)] |
74 | | pub struct ICU4XLocaleFallbackerWithConfig<'a>(pub LocaleFallbackerWithConfig<'a>); |
75 | | |
76 | | /// An iterator over the locale under fallback. |
77 | | #[diplomat::opaque] |
78 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbackIterator, Struct)] |
79 | | pub struct ICU4XLocaleFallbackIterator<'a>(pub LocaleFallbackIterator<'a, 'a>); |
80 | | |
81 | | impl ICU4XLocaleFallbacker { |
82 | | /// Creates a new `ICU4XLocaleFallbacker` from a data provider. |
83 | | #[diplomat::rust_link(icu::locid_transform::fallback::LocaleFallbacker::new, FnInStruct)] |
84 | | #[diplomat::attr(all(supports = constructors, supports = fallible_constructors), constructor)] |
85 | 0 | pub fn create( |
86 | 0 | provider: &ICU4XDataProvider, |
87 | 0 | ) -> Result<Box<ICU4XLocaleFallbacker>, ICU4XError> { |
88 | 0 | Ok(Box::new(ICU4XLocaleFallbacker(call_constructor!( |
89 | 0 | LocaleFallbacker::new [r => Ok(r.static_to_owned())], |
90 | | LocaleFallbacker::try_new_with_any_provider, |
91 | | LocaleFallbacker::try_new_with_buffer_provider, |
92 | | provider, |
93 | 0 | )?))) |
94 | 0 | } |
95 | | |
96 | | /// Creates a new `ICU4XLocaleFallbacker` without data for limited functionality. |
97 | | #[diplomat::rust_link( |
98 | | icu::locid_transform::fallback::LocaleFallbacker::new_without_data, |
99 | | FnInStruct |
100 | | )] |
101 | | #[diplomat::attr(all(supports = constructors, supports = fallible_constructors, supports = named_constructors), named_constructor = "without_data")] |
102 | 0 | pub fn create_without_data() -> Box<ICU4XLocaleFallbacker> { |
103 | 0 | Box::new(ICU4XLocaleFallbacker(LocaleFallbacker::new_without_data())) |
104 | 0 | } |
105 | | |
106 | | /// Associates this `ICU4XLocaleFallbacker` with configuration options. |
107 | | #[diplomat::rust_link( |
108 | | icu::locid_transform::fallback::LocaleFallbacker::for_config, |
109 | | FnInStruct |
110 | | )] |
111 | | #[diplomat::rust_link( |
112 | | icu::locid_transform::fallback::LocaleFallbackerBorrowed::for_config, |
113 | | FnInStruct, |
114 | | hidden |
115 | | )] |
116 | 0 | pub fn for_config<'a, 'temp>( |
117 | 0 | &'a self, |
118 | 0 | config: ICU4XLocaleFallbackConfig<'temp>, |
119 | 0 | ) -> Result<Box<ICU4XLocaleFallbackerWithConfig<'a>>, ICU4XError> { |
120 | 0 | Ok(Box::new(ICU4XLocaleFallbackerWithConfig( |
121 | 0 | self.0.for_config(LocaleFallbackConfig::try_from(config)?), |
122 | | ))) |
123 | 0 | } |
124 | | } |
125 | | |
126 | | impl<'a> ICU4XLocaleFallbackerWithConfig<'a> { |
127 | | /// Creates an iterator from a locale with each step of fallback. |
128 | | #[diplomat::rust_link( |
129 | | icu::locid_transform::fallback::LocaleFallbacker::fallback_for, |
130 | | FnInStruct |
131 | | )] |
132 | | #[diplomat::rust_link( |
133 | | icu::locid_transform::fallback::LocaleFallbackerBorrowed::fallback_for, |
134 | | FnInStruct, |
135 | | hidden |
136 | | )] |
137 | | #[diplomat::rust_link( |
138 | | icu::locid_transform::fallback::LocaleFallbackerWithConfig::fallback_for, |
139 | | FnInStruct, |
140 | | hidden |
141 | | )] |
142 | 0 | pub fn fallback_for_locale<'b: 'a, 'temp>( |
143 | 0 | &'b self, |
144 | 0 | locale: &'temp ICU4XLocale, |
145 | 0 | ) -> Box<ICU4XLocaleFallbackIterator<'a>> { |
146 | 0 | Box::new(ICU4XLocaleFallbackIterator( |
147 | 0 | self.0.fallback_for((&locale.0).into()), |
148 | 0 | )) |
149 | 0 | } |
150 | | } |
151 | | |
152 | | impl<'a> ICU4XLocaleFallbackIterator<'a> { |
153 | | /// Gets a snapshot of the current state of the locale. |
154 | | #[diplomat::rust_link( |
155 | | icu::locid_transform::fallback::LocaleFallbackIterator::get, |
156 | | FnInStruct |
157 | | )] |
158 | | #[diplomat::rust_link( |
159 | | icu::locid_transform::fallback::LocaleFallbackIterator::take, |
160 | | FnInStruct, |
161 | | hidden |
162 | | )] |
163 | | #[diplomat::attr(*, disable)] |
164 | 0 | pub fn get(&self) -> Box<ICU4XLocale> { |
165 | 0 | Box::new(ICU4XLocale(self.0.get().clone().into_locale())) |
166 | 0 | } |
167 | | |
168 | | /// Performs one step of the fallback algorithm, mutating the locale. |
169 | | #[diplomat::rust_link( |
170 | | icu::locid_transform::fallback::LocaleFallbackIterator::step, |
171 | | FnInStruct |
172 | | )] |
173 | | #[diplomat::attr(*, disable)] |
174 | 0 | pub fn step(&mut self) { |
175 | 0 | self.0.step(); |
176 | 0 | } |
177 | | |
178 | | /// A combination of `get` and `step`. Returns the value that `get` would return |
179 | | /// and advances the iterator until hitting `und`. |
180 | | #[diplomat::attr(supports = iterators, iterator)] |
181 | | #[diplomat::skip_if_ast] |
182 | 0 | pub fn next(&mut self) -> Option<Box<ICU4XLocale>> { |
183 | 0 | let current = self.get(); |
184 | 0 | if current.0 == icu_locid::Locale::UND { |
185 | 0 | None |
186 | | } else { |
187 | 0 | self.step(); |
188 | 0 | Some(current) |
189 | | } |
190 | 0 | } |
191 | | } |
192 | | } |
193 | | |
194 | | impl TryFrom<ffi::ICU4XLocaleFallbackConfig<'_>> |
195 | | for icu_locid_transform::fallback::LocaleFallbackConfig |
196 | | { |
197 | | type Error = crate::errors::ffi::ICU4XError; |
198 | 0 | fn try_from(other: ffi::ICU4XLocaleFallbackConfig) -> Result<Self, Self::Error> { |
199 | 0 | let mut result = Self::default(); |
200 | 0 | result.priority = other.priority.into(); |
201 | 0 | result.extension_key = match other.extension_key { |
202 | 0 | b"" => None, |
203 | 0 | s => Some(icu_locid::extensions::unicode::Key::try_from_bytes(s)?), |
204 | | }; |
205 | 0 | result.fallback_supplement = match other.fallback_supplement { |
206 | 0 | ffi::ICU4XLocaleFallbackSupplement::None => None, |
207 | | ffi::ICU4XLocaleFallbackSupplement::Collation => { |
208 | 0 | Some(icu_locid_transform::fallback::LocaleFallbackSupplement::Collation) |
209 | | } |
210 | | }; |
211 | 0 | Ok(result) |
212 | 0 | } |
213 | | } |