/rust/registry/src/index.crates.io-1949cf8c6b5b557f/icu_datetime-1.5.1/src/calendar.rs
Line | Count | Source |
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 | | use crate::provider::calendar::*; |
6 | | use icu_calendar::any_calendar::AnyCalendarKind; |
7 | | use icu_calendar::chinese::Chinese; |
8 | | use icu_calendar::roc::Roc; |
9 | | use icu_calendar::AnyCalendar; |
10 | | use icu_calendar::{ |
11 | | buddhist::Buddhist, coptic::Coptic, dangi::Dangi, ethiopian::Ethiopian, hebrew::Hebrew, |
12 | | indian::Indian, islamic::IslamicCivil, islamic::IslamicObservational, islamic::IslamicTabular, |
13 | | islamic::IslamicUmmAlQura, japanese::Japanese, japanese::JapaneseExtended, persian::Persian, |
14 | | Gregorian, |
15 | | }; |
16 | | use icu_locid::extensions::unicode::{value, Value}; |
17 | | use icu_provider::prelude::*; |
18 | | use tinystr::{tinystr, TinyAsciiStr}; |
19 | | |
20 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
21 | | use crate::provider::neo::*; |
22 | | #[cfg(feature = "experimental")] |
23 | | use core::marker::PhantomData; |
24 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
25 | | use icu_provider::NeverMarker; |
26 | | |
27 | | /// The `CldrCalendar` trait is sealed except when the `"experimental"` Cargo |
28 | | /// feature is enabled. If implementing `CldrCalendar`, you must also |
29 | | /// implement `UnstableCldrCalendar` and acknowledge the stability policy. |
30 | | /// |
31 | | /// <div class="stab unstable"> |
32 | | /// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways, |
33 | | /// including in SemVer minor releases. Do not implement this trait in userland. |
34 | | /// </div> |
35 | | // Exported as `#[cfg(feature = "experimental")]` in lib.rs |
36 | | // TODO(#4338): Decide what to do with this when we retire this crate's "experimental" feature. |
37 | | pub trait InternalCldrCalendar {} |
38 | | |
39 | | /// A calendar that can be found in CLDR |
40 | | /// |
41 | | /// New implementors of this trait will likely also wish to modify `get_era_code_map()` |
42 | | /// in the CLDR transformer to support any new era maps. |
43 | | /// |
44 | | /// <div class="stab unstable"> |
45 | | /// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways, |
46 | | /// including in SemVer minor releases. Do not implement this trait in userland. |
47 | | /// </div> |
48 | | pub trait CldrCalendar: InternalCldrCalendar { |
49 | | /// The Unicode BCP 47 identifier for the calendar's skeleton |
50 | | /// If multiple BCP 47 identifiers work, this should be |
51 | | /// the default one when no others are provided |
52 | | /// |
53 | | /// If `is_identifier_allowed_for_calendar()` is set, this only is used for loading skeletons data |
54 | | const DEFAULT_BCP_47_IDENTIFIER: Value; |
55 | | |
56 | | /// The data marker for loading symbols for this calendar. |
57 | | type DateSymbolsV1Marker: KeyedDataMarker<Yokeable = DateSymbolsV1<'static>>; |
58 | | |
59 | | /// The data marker for loading length-patterns for this calendar. |
60 | | type DateLengthsV1Marker: KeyedDataMarker<Yokeable = DateLengthsV1<'static>>; |
61 | | |
62 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
63 | | /// The data marker for loading year symbols for this calendar. |
64 | | type YearNamesV1Marker: KeyedDataMarker<Yokeable = YearNamesV1<'static>>; |
65 | | |
66 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
67 | | /// The data marker for loading month symbols for this calendar. |
68 | | type MonthNamesV1Marker: KeyedDataMarker<Yokeable = MonthNamesV1<'static>>; |
69 | | |
70 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
71 | | /// The data marker for loading a single date pattern for this calendar. |
72 | | type DatePatternV1Marker: KeyedDataMarker<Yokeable = DatePatternV1<'static>>; |
73 | | |
74 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
75 | | /// The data marker for loading skeleton patterns for this calendar. |
76 | | type SkeletaV1Marker: KeyedDataMarker<Yokeable = PackedSkeletonDataV1<'static>>; |
77 | | |
78 | | /// Checks if a given BCP 47 identifier is allowed to be used with this calendar |
79 | | /// |
80 | | /// By default, just checks against DEFAULT_BCP_47_IDENTIFIER |
81 | 0 | fn is_identifier_allowed_for_calendar(value: &Value) -> bool { |
82 | 0 | *value == Self::DEFAULT_BCP_47_IDENTIFIER |
83 | 0 | } |
84 | | } |
85 | | |
86 | | /// Check if the provided value is of the form `islamic-{subcal}` |
87 | 0 | fn is_islamic_subcal(value: &Value, subcal: TinyAsciiStr<8>) -> bool { |
88 | 0 | if let &[first, second] = value.as_tinystr_slice() { |
89 | 0 | first == "islamic" && second == subcal |
90 | | } else { |
91 | 0 | false |
92 | | } |
93 | 0 | } |
94 | | |
95 | | /// A calendar that can never exist. |
96 | | /// |
97 | | /// Used as a substitute for calendar parameters when a calendar is not needed, |
98 | | /// such as in a time formatter. |
99 | | #[derive(Debug)] |
100 | | #[allow(clippy::exhaustive_enums)] // empty enum |
101 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
102 | | pub enum NeverCalendar {} |
103 | | |
104 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
105 | | impl CldrCalendar for NeverCalendar { |
106 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("never"); |
107 | | type DateSymbolsV1Marker = NeverMarker<DateSymbolsV1<'static>>; |
108 | | type DateLengthsV1Marker = NeverMarker<DateLengthsV1<'static>>; |
109 | | type YearNamesV1Marker = NeverMarker<YearNamesV1<'static>>; |
110 | | type MonthNamesV1Marker = NeverMarker<MonthNamesV1<'static>>; |
111 | | type DatePatternV1Marker = NeverMarker<DatePatternV1<'static>>; |
112 | | type SkeletaV1Marker = NeverMarker<PackedSkeletonDataV1<'static>>; |
113 | | } |
114 | | |
115 | | impl CldrCalendar for Buddhist { |
116 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("buddhist"); |
117 | | type DateSymbolsV1Marker = BuddhistDateSymbolsV1Marker; |
118 | | type DateLengthsV1Marker = BuddhistDateLengthsV1Marker; |
119 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
120 | | type YearNamesV1Marker = BuddhistYearNamesV1Marker; |
121 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
122 | | type MonthNamesV1Marker = BuddhistMonthNamesV1Marker; |
123 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
124 | | type DatePatternV1Marker = BuddhistDatePatternV1Marker; |
125 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
126 | | type SkeletaV1Marker = BuddhistDateNeoSkeletonPatternsV1Marker; |
127 | | } |
128 | | |
129 | | impl CldrCalendar for Chinese { |
130 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("chinese"); |
131 | | type DateSymbolsV1Marker = ChineseDateSymbolsV1Marker; |
132 | | type DateLengthsV1Marker = ChineseDateLengthsV1Marker; |
133 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
134 | | type YearNamesV1Marker = ChineseYearNamesV1Marker; |
135 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
136 | | type MonthNamesV1Marker = ChineseMonthNamesV1Marker; |
137 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
138 | | type DatePatternV1Marker = ChineseDatePatternV1Marker; |
139 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
140 | | type SkeletaV1Marker = ChineseDateNeoSkeletonPatternsV1Marker; |
141 | | } |
142 | | |
143 | | impl CldrCalendar for Coptic { |
144 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("coptic"); |
145 | | type DateSymbolsV1Marker = CopticDateSymbolsV1Marker; |
146 | | type DateLengthsV1Marker = CopticDateLengthsV1Marker; |
147 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
148 | | type YearNamesV1Marker = CopticYearNamesV1Marker; |
149 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
150 | | type MonthNamesV1Marker = CopticMonthNamesV1Marker; |
151 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
152 | | type DatePatternV1Marker = CopticDatePatternV1Marker; |
153 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
154 | | type SkeletaV1Marker = CopticDateNeoSkeletonPatternsV1Marker; |
155 | | } |
156 | | |
157 | | impl CldrCalendar for Dangi { |
158 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("dangi"); |
159 | | type DateSymbolsV1Marker = DangiDateSymbolsV1Marker; |
160 | | type DateLengthsV1Marker = DangiDateLengthsV1Marker; |
161 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
162 | | type YearNamesV1Marker = DangiYearNamesV1Marker; |
163 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
164 | | type MonthNamesV1Marker = DangiMonthNamesV1Marker; |
165 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
166 | | type DatePatternV1Marker = DangiDatePatternV1Marker; |
167 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
168 | | type SkeletaV1Marker = DangiDateNeoSkeletonPatternsV1Marker; |
169 | | } |
170 | | |
171 | | impl CldrCalendar for Ethiopian { |
172 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("ethiopic"); |
173 | | type DateSymbolsV1Marker = EthiopianDateSymbolsV1Marker; |
174 | | type DateLengthsV1Marker = EthiopianDateLengthsV1Marker; |
175 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
176 | | type YearNamesV1Marker = EthiopianYearNamesV1Marker; |
177 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
178 | | type MonthNamesV1Marker = EthiopianMonthNamesV1Marker; |
179 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
180 | | type DatePatternV1Marker = EthiopianDatePatternV1Marker; |
181 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
182 | | type SkeletaV1Marker = EthiopianDateNeoSkeletonPatternsV1Marker; |
183 | 0 | fn is_identifier_allowed_for_calendar(value: &Value) -> bool { |
184 | 0 | *value == value!("ethiopic") || *value == value!("ethioaa") |
185 | 0 | } |
186 | | } |
187 | | |
188 | | impl CldrCalendar for Gregorian { |
189 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("gregory"); |
190 | | type DateSymbolsV1Marker = GregorianDateSymbolsV1Marker; |
191 | | type DateLengthsV1Marker = GregorianDateLengthsV1Marker; |
192 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
193 | | type YearNamesV1Marker = GregorianYearNamesV1Marker; |
194 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
195 | | type MonthNamesV1Marker = GregorianMonthNamesV1Marker; |
196 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
197 | | type DatePatternV1Marker = GregorianDatePatternV1Marker; |
198 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
199 | | type SkeletaV1Marker = GregorianDateNeoSkeletonPatternsV1Marker; |
200 | | } |
201 | | |
202 | | impl CldrCalendar for Hebrew { |
203 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("hebrew"); |
204 | | type DateSymbolsV1Marker = HebrewDateSymbolsV1Marker; |
205 | | type DateLengthsV1Marker = HebrewDateLengthsV1Marker; |
206 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
207 | | type YearNamesV1Marker = HebrewYearNamesV1Marker; |
208 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
209 | | type MonthNamesV1Marker = HebrewMonthNamesV1Marker; |
210 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
211 | | type DatePatternV1Marker = HebrewDatePatternV1Marker; |
212 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
213 | | type SkeletaV1Marker = HebrewDateNeoSkeletonPatternsV1Marker; |
214 | | } |
215 | | |
216 | | impl CldrCalendar for Indian { |
217 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("indian"); |
218 | | type DateSymbolsV1Marker = IndianDateSymbolsV1Marker; |
219 | | type DateLengthsV1Marker = IndianDateLengthsV1Marker; |
220 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
221 | | type YearNamesV1Marker = IndianYearNamesV1Marker; |
222 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
223 | | type MonthNamesV1Marker = IndianMonthNamesV1Marker; |
224 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
225 | | type DatePatternV1Marker = IndianDatePatternV1Marker; |
226 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
227 | | type SkeletaV1Marker = IndianDateNeoSkeletonPatternsV1Marker; |
228 | | } |
229 | | |
230 | | impl CldrCalendar for IslamicCivil { |
231 | | // this value is not actually a valid identifier for this calendar, |
232 | | // however since we are overriding is_identifier_allowed_for_calendar we are using |
233 | | // this solely for its effects on skeleton data loading |
234 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("islamic"); |
235 | | type DateSymbolsV1Marker = IslamicDateSymbolsV1Marker; |
236 | | type DateLengthsV1Marker = IslamicDateLengthsV1Marker; |
237 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
238 | | type YearNamesV1Marker = IslamicYearNamesV1Marker; |
239 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
240 | | type MonthNamesV1Marker = IslamicMonthNamesV1Marker; |
241 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
242 | | type DatePatternV1Marker = IslamicDatePatternV1Marker; |
243 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
244 | | type SkeletaV1Marker = IslamicDateNeoSkeletonPatternsV1Marker; |
245 | 0 | fn is_identifier_allowed_for_calendar(value: &Value) -> bool { |
246 | 0 | *value == value!("islamicc") || is_islamic_subcal(value, tinystr!(8, "civil")) |
247 | 0 | } |
248 | | } |
249 | | |
250 | | impl CldrCalendar for IslamicObservational { |
251 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("islamic"); |
252 | | type DateSymbolsV1Marker = IslamicDateSymbolsV1Marker; |
253 | | type DateLengthsV1Marker = IslamicDateLengthsV1Marker; |
254 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
255 | | type YearNamesV1Marker = IslamicYearNamesV1Marker; |
256 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
257 | | type MonthNamesV1Marker = IslamicMonthNamesV1Marker; |
258 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
259 | | type DatePatternV1Marker = IslamicDatePatternV1Marker; |
260 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
261 | | type SkeletaV1Marker = IslamicDateNeoSkeletonPatternsV1Marker; |
262 | | } |
263 | | |
264 | | impl CldrCalendar for IslamicTabular { |
265 | | // this value is not actually a valid identifier for this calendar, |
266 | | // however since we are overriding is_identifier_allowed_for_calendar we are using |
267 | | // this solely for its effects on skeleton data loading |
268 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("islamic"); |
269 | | type DateSymbolsV1Marker = IslamicDateSymbolsV1Marker; |
270 | | type DateLengthsV1Marker = IslamicDateLengthsV1Marker; |
271 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
272 | | type YearNamesV1Marker = IslamicYearNamesV1Marker; |
273 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
274 | | type MonthNamesV1Marker = IslamicMonthNamesV1Marker; |
275 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
276 | | type DatePatternV1Marker = IslamicDatePatternV1Marker; |
277 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
278 | | type SkeletaV1Marker = IslamicDateNeoSkeletonPatternsV1Marker; |
279 | 0 | fn is_identifier_allowed_for_calendar(value: &Value) -> bool { |
280 | 0 | is_islamic_subcal(value, tinystr!(8, "tbla")) |
281 | 0 | } |
282 | | } |
283 | | |
284 | | impl CldrCalendar for IslamicUmmAlQura { |
285 | | // this value is not actually a valid identifier for this calendar, |
286 | | // however since we are overriding is_identifier_allowed_for_calendar we are using |
287 | | // this solely for its effects on skeleton data loading |
288 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("islamic"); |
289 | | type DateSymbolsV1Marker = IslamicDateSymbolsV1Marker; |
290 | | type DateLengthsV1Marker = IslamicDateLengthsV1Marker; |
291 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
292 | | type YearNamesV1Marker = IslamicYearNamesV1Marker; |
293 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
294 | | type MonthNamesV1Marker = IslamicMonthNamesV1Marker; |
295 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
296 | | type DatePatternV1Marker = IslamicDatePatternV1Marker; |
297 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
298 | | type SkeletaV1Marker = IslamicDateNeoSkeletonPatternsV1Marker; |
299 | 0 | fn is_identifier_allowed_for_calendar(value: &Value) -> bool { |
300 | 0 | is_islamic_subcal(value, tinystr!(8, "umalqura")) |
301 | 0 | } |
302 | | } |
303 | | |
304 | | impl CldrCalendar for Japanese { |
305 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("japanese"); |
306 | | type DateSymbolsV1Marker = JapaneseDateSymbolsV1Marker; |
307 | | type DateLengthsV1Marker = JapaneseDateLengthsV1Marker; |
308 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
309 | | type YearNamesV1Marker = JapaneseYearNamesV1Marker; |
310 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
311 | | type MonthNamesV1Marker = JapaneseMonthNamesV1Marker; |
312 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
313 | | type DatePatternV1Marker = JapaneseDatePatternV1Marker; |
314 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
315 | | type SkeletaV1Marker = JapaneseDateNeoSkeletonPatternsV1Marker; |
316 | | } |
317 | | |
318 | | impl CldrCalendar for JapaneseExtended { |
319 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("japanext"); |
320 | | type DateSymbolsV1Marker = JapaneseExtendedDateSymbolsV1Marker; |
321 | | type DateLengthsV1Marker = JapaneseExtendedDateLengthsV1Marker; |
322 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
323 | | type YearNamesV1Marker = JapaneseExtendedYearNamesV1Marker; |
324 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
325 | | type MonthNamesV1Marker = JapaneseExtendedMonthNamesV1Marker; |
326 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
327 | | type DatePatternV1Marker = JapaneseExtendedDatePatternV1Marker; |
328 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
329 | | type SkeletaV1Marker = JapaneseExtendedDateNeoSkeletonPatternsV1Marker; |
330 | | } |
331 | | |
332 | | impl CldrCalendar for Persian { |
333 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("persian"); |
334 | | type DateSymbolsV1Marker = PersianDateSymbolsV1Marker; |
335 | | type DateLengthsV1Marker = PersianDateLengthsV1Marker; |
336 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
337 | | type YearNamesV1Marker = PersianYearNamesV1Marker; |
338 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
339 | | type MonthNamesV1Marker = PersianMonthNamesV1Marker; |
340 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
341 | | type DatePatternV1Marker = PersianDatePatternV1Marker; |
342 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
343 | | type SkeletaV1Marker = PersianDateNeoSkeletonPatternsV1Marker; |
344 | | } |
345 | | |
346 | | impl CldrCalendar for Roc { |
347 | | const DEFAULT_BCP_47_IDENTIFIER: Value = value!("roc"); |
348 | | type DateSymbolsV1Marker = RocDateSymbolsV1Marker; |
349 | | type DateLengthsV1Marker = RocDateLengthsV1Marker; |
350 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
351 | | type YearNamesV1Marker = RocYearNamesV1Marker; |
352 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
353 | | type MonthNamesV1Marker = RocMonthNamesV1Marker; |
354 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
355 | | type DatePatternV1Marker = RocDatePatternV1Marker; |
356 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
357 | | type SkeletaV1Marker = RocDateNeoSkeletonPatternsV1Marker; |
358 | | } |
359 | | |
360 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
361 | | impl InternalCldrCalendar for NeverCalendar {} |
362 | | impl InternalCldrCalendar for Buddhist {} |
363 | | impl InternalCldrCalendar for Chinese {} |
364 | | impl InternalCldrCalendar for Coptic {} |
365 | | impl InternalCldrCalendar for Dangi {} |
366 | | impl InternalCldrCalendar for Ethiopian {} |
367 | | impl InternalCldrCalendar for Gregorian {} |
368 | | impl InternalCldrCalendar for Hebrew {} |
369 | | impl InternalCldrCalendar for Indian {} |
370 | | impl InternalCldrCalendar for IslamicCivil {} |
371 | | impl InternalCldrCalendar for IslamicObservational {} |
372 | | impl InternalCldrCalendar for IslamicTabular {} |
373 | | impl InternalCldrCalendar for IslamicUmmAlQura {} |
374 | | impl InternalCldrCalendar for Japanese {} |
375 | | impl InternalCldrCalendar for JapaneseExtended {} |
376 | | impl InternalCldrCalendar for Persian {} |
377 | | impl InternalCldrCalendar for Roc {} |
378 | | |
379 | 0 | pub(crate) fn load_lengths_for_cldr_calendar<C, P>( |
380 | 0 | provider: &P, |
381 | 0 | locale: &DataLocale, |
382 | 0 | ) -> Result<DataPayload<ErasedDateLengthsV1Marker>, DataError> |
383 | 0 | where |
384 | 0 | C: CldrCalendar, |
385 | 0 | P: DataProvider<<C as CldrCalendar>::DateLengthsV1Marker> + ?Sized, |
386 | | { |
387 | 0 | let payload = provider |
388 | 0 | .load(DataRequest { |
389 | 0 | locale, |
390 | 0 | metadata: Default::default(), |
391 | 0 | })? |
392 | 0 | .take_payload()?; |
393 | 0 | Ok(payload.cast()) |
394 | 0 | } Unexecuted instantiation: icu_datetime::calendar::load_lengths_for_cldr_calendar::<icu_calendar::gregorian::Gregorian, icu_provider::any::DowncastingAnyProvider<icu_provider_adapters::empty::EmptyDataProvider>> Unexecuted instantiation: icu_datetime::calendar::load_lengths_for_cldr_calendar::<icu_calendar::gregorian::Gregorian, icu_datetime::provider::Baked> Unexecuted instantiation: icu_datetime::calendar::load_lengths_for_cldr_calendar::<_, _> |
395 | | |
396 | 0 | pub(crate) fn load_symbols_for_cldr_calendar<C, P>( |
397 | 0 | provider: &P, |
398 | 0 | locale: &DataLocale, |
399 | 0 | ) -> Result<DataPayload<ErasedDateSymbolsV1Marker>, DataError> |
400 | 0 | where |
401 | 0 | C: CldrCalendar, |
402 | 0 | P: DataProvider<<C as CldrCalendar>::DateSymbolsV1Marker> + ?Sized, |
403 | | { |
404 | 0 | let payload = provider |
405 | 0 | .load(DataRequest { |
406 | 0 | locale, |
407 | 0 | metadata: Default::default(), |
408 | 0 | })? |
409 | 0 | .take_payload()?; |
410 | 0 | Ok(payload.cast()) |
411 | 0 | } Unexecuted instantiation: icu_datetime::calendar::load_symbols_for_cldr_calendar::<icu_calendar::gregorian::Gregorian, icu_provider::any::DowncastingAnyProvider<icu_provider_adapters::empty::EmptyDataProvider>> Unexecuted instantiation: icu_datetime::calendar::load_symbols_for_cldr_calendar::<icu_calendar::gregorian::Gregorian, icu_datetime::provider::Baked> Unexecuted instantiation: icu_datetime::calendar::load_symbols_for_cldr_calendar::<_, _> |
412 | | |
413 | 0 | pub(crate) fn load_lengths_for_any_calendar_kind<P>( |
414 | 0 | provider: &P, |
415 | 0 | locale: &DataLocale, |
416 | 0 | kind: AnyCalendarKind, |
417 | 0 | ) -> Result<DataPayload<ErasedDateLengthsV1Marker>, DataError> |
418 | 0 | where |
419 | 0 | P: DataProvider<BuddhistDateLengthsV1Marker> |
420 | 0 | + DataProvider<ChineseDateLengthsV1Marker> |
421 | 0 | + DataProvider<CopticDateLengthsV1Marker> |
422 | 0 | + DataProvider<DangiDateLengthsV1Marker> |
423 | 0 | + DataProvider<EthiopianDateLengthsV1Marker> |
424 | 0 | + DataProvider<GregorianDateLengthsV1Marker> |
425 | 0 | + DataProvider<HebrewDateLengthsV1Marker> |
426 | 0 | + DataProvider<IndianDateLengthsV1Marker> |
427 | 0 | + DataProvider<IslamicDateLengthsV1Marker> |
428 | 0 | + DataProvider<JapaneseDateLengthsV1Marker> |
429 | 0 | + DataProvider<JapaneseExtendedDateLengthsV1Marker> |
430 | 0 | + DataProvider<PersianDateLengthsV1Marker> |
431 | 0 | + DataProvider<RocDateLengthsV1Marker> |
432 | 0 | + ?Sized, |
433 | | { |
434 | 0 | let req = DataRequest { |
435 | 0 | locale, |
436 | 0 | metadata: Default::default(), |
437 | 0 | }; |
438 | 0 | let payload = match kind { |
439 | | AnyCalendarKind::Buddhist => { |
440 | 0 | DataProvider::<<Buddhist as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
441 | 0 | .take_payload()? |
442 | 0 | .cast() |
443 | | } |
444 | | AnyCalendarKind::Chinese => { |
445 | 0 | DataProvider::<<Chinese as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
446 | 0 | .take_payload()? |
447 | 0 | .cast() |
448 | | } |
449 | | AnyCalendarKind::Coptic => { |
450 | 0 | DataProvider::<<Coptic as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
451 | 0 | .take_payload()? |
452 | 0 | .cast() |
453 | | } |
454 | | AnyCalendarKind::Dangi => { |
455 | 0 | DataProvider::<<Dangi as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
456 | 0 | .take_payload()? |
457 | 0 | .cast() |
458 | | } |
459 | | AnyCalendarKind::Ethiopian => { |
460 | 0 | DataProvider::<<Ethiopian as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
461 | 0 | .take_payload()? |
462 | 0 | .cast() |
463 | | } |
464 | | AnyCalendarKind::EthiopianAmeteAlem => { |
465 | 0 | DataProvider::<<Ethiopian as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
466 | 0 | .take_payload()? |
467 | 0 | .cast() |
468 | | } |
469 | | AnyCalendarKind::Gregorian => { |
470 | 0 | DataProvider::<<Gregorian as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
471 | 0 | .take_payload()? |
472 | 0 | .cast() |
473 | | } |
474 | | AnyCalendarKind::Hebrew => { |
475 | 0 | DataProvider::<<Hebrew as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
476 | 0 | .take_payload()? |
477 | 0 | .cast() |
478 | | } |
479 | | AnyCalendarKind::Indian => { |
480 | 0 | DataProvider::<<Indian as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
481 | 0 | .take_payload()? |
482 | 0 | .cast() |
483 | | } |
484 | 0 | AnyCalendarKind::IslamicCivil => DataProvider::< |
485 | 0 | <IslamicCivil as CldrCalendar>::DateLengthsV1Marker, |
486 | 0 | >::load(provider, req)? |
487 | 0 | .take_payload()? |
488 | 0 | .cast(), |
489 | 0 | AnyCalendarKind::IslamicObservational => DataProvider::< |
490 | 0 | <IslamicObservational as CldrCalendar>::DateLengthsV1Marker, |
491 | 0 | >::load(provider, req)? |
492 | 0 | .take_payload()? |
493 | 0 | .cast(), |
494 | 0 | AnyCalendarKind::IslamicTabular => DataProvider::< |
495 | 0 | <IslamicTabular as CldrCalendar>::DateLengthsV1Marker, |
496 | 0 | >::load(provider, req)? |
497 | 0 | .take_payload()? |
498 | 0 | .cast(), |
499 | 0 | AnyCalendarKind::IslamicUmmAlQura => DataProvider::< |
500 | 0 | <IslamicUmmAlQura as CldrCalendar>::DateLengthsV1Marker, |
501 | 0 | >::load(provider, req)? |
502 | 0 | .take_payload()? |
503 | 0 | .cast(), |
504 | | AnyCalendarKind::Japanese => { |
505 | 0 | DataProvider::<<Japanese as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
506 | 0 | .take_payload()? |
507 | 0 | .cast() |
508 | | } |
509 | 0 | AnyCalendarKind::JapaneseExtended => DataProvider::< |
510 | 0 | <JapaneseExtended as CldrCalendar>::DateLengthsV1Marker, |
511 | 0 | >::load(provider, req)? |
512 | 0 | .take_payload()? |
513 | 0 | .cast(), |
514 | | AnyCalendarKind::Persian => { |
515 | 0 | DataProvider::<<Persian as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
516 | 0 | .take_payload()? |
517 | 0 | .cast() |
518 | | } |
519 | | AnyCalendarKind::Roc => { |
520 | 0 | DataProvider::<<Roc as CldrCalendar>::DateLengthsV1Marker>::load(provider, req)? |
521 | 0 | .take_payload()? |
522 | 0 | .cast() |
523 | | } |
524 | | _ => { |
525 | 0 | return Err( |
526 | 0 | DataError::custom("Don't know how to load data for specified calendar") |
527 | 0 | .with_debug_context(&kind), |
528 | 0 | ) |
529 | | } |
530 | | }; |
531 | 0 | Ok(payload) |
532 | 0 | } Unexecuted instantiation: icu_datetime::calendar::load_lengths_for_any_calendar_kind::<icu_provider::any::DowncastingAnyProvider<icu_provider_adapters::empty::EmptyDataProvider>> Unexecuted instantiation: icu_datetime::calendar::load_lengths_for_any_calendar_kind::<icu_datetime::provider::Baked> |
533 | | |
534 | 0 | pub(crate) fn load_symbols_for_any_calendar_kind<P>( |
535 | 0 | provider: &P, |
536 | 0 | locale: &DataLocale, |
537 | 0 | kind: AnyCalendarKind, |
538 | 0 | ) -> Result<DataPayload<ErasedDateSymbolsV1Marker>, DataError> |
539 | 0 | where |
540 | 0 | P: DataProvider<BuddhistDateSymbolsV1Marker> |
541 | 0 | + DataProvider<ChineseDateSymbolsV1Marker> |
542 | 0 | + DataProvider<CopticDateSymbolsV1Marker> |
543 | 0 | + DataProvider<DangiDateSymbolsV1Marker> |
544 | 0 | + DataProvider<EthiopianDateSymbolsV1Marker> |
545 | 0 | + DataProvider<GregorianDateSymbolsV1Marker> |
546 | 0 | + DataProvider<HebrewDateSymbolsV1Marker> |
547 | 0 | + DataProvider<IndianDateSymbolsV1Marker> |
548 | 0 | + DataProvider<IslamicDateSymbolsV1Marker> |
549 | 0 | + DataProvider<JapaneseDateSymbolsV1Marker> |
550 | 0 | + DataProvider<JapaneseExtendedDateSymbolsV1Marker> |
551 | 0 | + DataProvider<PersianDateSymbolsV1Marker> |
552 | 0 | + DataProvider<RocDateSymbolsV1Marker> |
553 | 0 | + ?Sized, |
554 | | { |
555 | 0 | let req = DataRequest { |
556 | 0 | locale, |
557 | 0 | metadata: Default::default(), |
558 | 0 | }; |
559 | 0 | let payload = match kind { |
560 | | AnyCalendarKind::Buddhist => { |
561 | 0 | DataProvider::<<Buddhist as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
562 | 0 | .take_payload()? |
563 | 0 | .cast() |
564 | | } |
565 | | AnyCalendarKind::Chinese => { |
566 | 0 | DataProvider::<<Chinese as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
567 | 0 | .take_payload()? |
568 | 0 | .cast() |
569 | | } |
570 | | AnyCalendarKind::Coptic => { |
571 | 0 | DataProvider::<<Coptic as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
572 | 0 | .take_payload()? |
573 | 0 | .cast() |
574 | | } |
575 | | AnyCalendarKind::Dangi => { |
576 | 0 | DataProvider::<<Dangi as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
577 | 0 | .take_payload()? |
578 | 0 | .cast() |
579 | | } |
580 | | AnyCalendarKind::Ethiopian => { |
581 | 0 | DataProvider::<<Ethiopian as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
582 | 0 | .take_payload()? |
583 | 0 | .cast() |
584 | | } |
585 | | AnyCalendarKind::EthiopianAmeteAlem => { |
586 | 0 | DataProvider::<<Ethiopian as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
587 | 0 | .take_payload()? |
588 | 0 | .cast() |
589 | | } |
590 | | AnyCalendarKind::Gregorian => { |
591 | 0 | DataProvider::<<Gregorian as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
592 | 0 | .take_payload()? |
593 | 0 | .cast() |
594 | | } |
595 | | AnyCalendarKind::Hebrew => { |
596 | 0 | DataProvider::<<Hebrew as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
597 | 0 | .take_payload()? |
598 | 0 | .cast() |
599 | | } |
600 | | AnyCalendarKind::Indian => { |
601 | 0 | DataProvider::<<Indian as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
602 | 0 | .take_payload()? |
603 | 0 | .cast() |
604 | | } |
605 | 0 | AnyCalendarKind::IslamicCivil => DataProvider::< |
606 | 0 | <IslamicCivil as CldrCalendar>::DateSymbolsV1Marker, |
607 | 0 | >::load(provider, req)? |
608 | 0 | .take_payload()? |
609 | 0 | .cast(), |
610 | 0 | AnyCalendarKind::IslamicObservational => DataProvider::< |
611 | 0 | <IslamicObservational as CldrCalendar>::DateSymbolsV1Marker, |
612 | 0 | >::load(provider, req)? |
613 | 0 | .take_payload()? |
614 | 0 | .cast(), |
615 | 0 | AnyCalendarKind::IslamicTabular => DataProvider::< |
616 | 0 | <IslamicTabular as CldrCalendar>::DateSymbolsV1Marker, |
617 | 0 | >::load(provider, req)? |
618 | 0 | .take_payload()? |
619 | 0 | .cast(), |
620 | 0 | AnyCalendarKind::IslamicUmmAlQura => DataProvider::< |
621 | 0 | <IslamicUmmAlQura as CldrCalendar>::DateSymbolsV1Marker, |
622 | 0 | >::load(provider, req)? |
623 | 0 | .take_payload()? |
624 | 0 | .cast(), |
625 | | AnyCalendarKind::Japanese => { |
626 | 0 | DataProvider::<<Japanese as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
627 | 0 | .take_payload()? |
628 | 0 | .cast() |
629 | | } |
630 | 0 | AnyCalendarKind::JapaneseExtended => DataProvider::< |
631 | 0 | <JapaneseExtended as CldrCalendar>::DateSymbolsV1Marker, |
632 | 0 | >::load(provider, req)? |
633 | 0 | .take_payload()? |
634 | 0 | .cast(), |
635 | | AnyCalendarKind::Persian => { |
636 | 0 | DataProvider::<<Persian as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
637 | 0 | .take_payload()? |
638 | 0 | .cast() |
639 | | } |
640 | | AnyCalendarKind::Roc => { |
641 | 0 | DataProvider::<<Roc as CldrCalendar>::DateSymbolsV1Marker>::load(provider, req)? |
642 | 0 | .take_payload()? |
643 | 0 | .cast() |
644 | | } |
645 | | _ => { |
646 | 0 | return Err( |
647 | 0 | DataError::custom("Don't know how to load data for specified calendar") |
648 | 0 | .with_debug_context(&kind), |
649 | 0 | ) |
650 | | } |
651 | | }; |
652 | 0 | Ok(payload) |
653 | 0 | } Unexecuted instantiation: icu_datetime::calendar::load_symbols_for_any_calendar_kind::<icu_provider::any::DowncastingAnyProvider<icu_provider_adapters::empty::EmptyDataProvider>> Unexecuted instantiation: icu_datetime::calendar::load_symbols_for_any_calendar_kind::<icu_datetime::provider::Baked> |
654 | | |
655 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
656 | | mod private { |
657 | | pub trait Sealed {} |
658 | | } |
659 | | |
660 | | /// A collection of marker types associated with all calendars. |
661 | | /// |
662 | | /// This is used to group together the calendar-specific marker types that produce a common |
663 | | /// [`DataMarker`]. For example, this trait can be implemented for [`YearNamesV1Marker`]. |
664 | | /// |
665 | | /// This trait serves as a building block for a cross-calendar [`BoundDataProvider`]. |
666 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
667 | | pub trait CalMarkers<M>: private::Sealed |
668 | | where |
669 | | M: DataMarker, |
670 | | { |
671 | | /// The type for a [`Buddhist`] calendar |
672 | | type Buddhist: KeyedDataMarker<Yokeable = M::Yokeable>; |
673 | | /// The type for a [`Chinese`] calendar |
674 | | type Chinese: KeyedDataMarker<Yokeable = M::Yokeable>; |
675 | | /// The type for a [`Coptic`] calendar |
676 | | type Coptic: KeyedDataMarker<Yokeable = M::Yokeable>; |
677 | | /// The type for a [`Dangi`] calendar |
678 | | type Dangi: KeyedDataMarker<Yokeable = M::Yokeable>; |
679 | | /// The type for an [`Ethiopian`] calendar, with Amete Mihret era |
680 | | type Ethiopian: KeyedDataMarker<Yokeable = M::Yokeable>; |
681 | | /// The type for an [`Ethiopian`] calendar, with Amete Alem era |
682 | | type EthiopianAmeteAlem: KeyedDataMarker<Yokeable = M::Yokeable>; |
683 | | /// The type for a [`Gregorian`] calendar |
684 | | type Gregorian: KeyedDataMarker<Yokeable = M::Yokeable>; |
685 | | /// The type for a [`Hebrew`] calendar |
686 | | type Hebrew: KeyedDataMarker<Yokeable = M::Yokeable>; |
687 | | /// The type for a [`Indian`] calendar |
688 | | type Indian: KeyedDataMarker<Yokeable = M::Yokeable>; |
689 | | /// The type for an [`IslamicCivil`] calendar |
690 | | type IslamicCivil: KeyedDataMarker<Yokeable = M::Yokeable>; |
691 | | /// The type for an [`IslamicObservational`] calendar |
692 | | type IslamicObservational: KeyedDataMarker<Yokeable = M::Yokeable>; |
693 | | /// The type for an [`IslamicTabular`] calendar |
694 | | type IslamicTabular: KeyedDataMarker<Yokeable = M::Yokeable>; |
695 | | /// The type for an [`IslamicUmmAlQura`] calendar |
696 | | type IslamicUmmAlQura: KeyedDataMarker<Yokeable = M::Yokeable>; |
697 | | /// The type for a [`Japanese`] calendar |
698 | | type Japanese: KeyedDataMarker<Yokeable = M::Yokeable>; |
699 | | /// The type for a [`JapaneseExtended`] calendar |
700 | | type JapaneseExtended: KeyedDataMarker<Yokeable = M::Yokeable>; |
701 | | /// The type for a [`Persian`] calendar |
702 | | type Persian: KeyedDataMarker<Yokeable = M::Yokeable>; |
703 | | /// The type for a [`Roc`] calendar |
704 | | type Roc: KeyedDataMarker<Yokeable = M::Yokeable>; |
705 | | } |
706 | | |
707 | | /// Implementation of [`CalMarkers`] that includes data for all calendars. |
708 | | #[derive(Debug)] |
709 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
710 | | #[allow(clippy::exhaustive_enums)] // empty enum |
711 | | pub enum FullDataCalMarkers {} |
712 | | |
713 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
714 | | impl private::Sealed for FullDataCalMarkers {} |
715 | | |
716 | | /// Implementation of [`CalMarkers`] that includes data for no calendars. |
717 | | #[derive(Debug)] |
718 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
719 | | #[allow(clippy::exhaustive_enums)] // empty enum |
720 | | pub enum NoDataCalMarkers {} |
721 | | |
722 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
723 | | impl private::Sealed for NoDataCalMarkers {} |
724 | | |
725 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
726 | | impl<M> CalMarkers<M> for NoDataCalMarkers |
727 | | where |
728 | | M: DataMarker, |
729 | | { |
730 | | type Buddhist = NeverMarker<M::Yokeable>; |
731 | | type Chinese = NeverMarker<M::Yokeable>; |
732 | | type Coptic = NeverMarker<M::Yokeable>; |
733 | | type Dangi = NeverMarker<M::Yokeable>; |
734 | | type Ethiopian = NeverMarker<M::Yokeable>; |
735 | | type EthiopianAmeteAlem = NeverMarker<M::Yokeable>; |
736 | | type Gregorian = NeverMarker<M::Yokeable>; |
737 | | type Hebrew = NeverMarker<M::Yokeable>; |
738 | | type Indian = NeverMarker<M::Yokeable>; |
739 | | type IslamicCivil = NeverMarker<M::Yokeable>; |
740 | | type IslamicObservational = NeverMarker<M::Yokeable>; |
741 | | type IslamicTabular = NeverMarker<M::Yokeable>; |
742 | | type IslamicUmmAlQura = NeverMarker<M::Yokeable>; |
743 | | type Japanese = NeverMarker<M::Yokeable>; |
744 | | type JapaneseExtended = NeverMarker<M::Yokeable>; |
745 | | type Persian = NeverMarker<M::Yokeable>; |
746 | | type Roc = NeverMarker<M::Yokeable>; |
747 | | } |
748 | | |
749 | | #[cfg(feature = "experimental")] |
750 | | pub(crate) struct AnyCalendarProvider<H, P> { |
751 | | provider: P, |
752 | | kind: AnyCalendarKind, |
753 | | _helper: PhantomData<H>, |
754 | | } |
755 | | |
756 | | #[cfg(feature = "experimental")] |
757 | | impl<H, P> AnyCalendarProvider<H, P> { |
758 | | pub(crate) fn new(provider: P, kind: AnyCalendarKind) -> Self { |
759 | | Self { |
760 | | provider, |
761 | | kind, |
762 | | _helper: PhantomData, |
763 | | } |
764 | | } |
765 | | } |
766 | | |
767 | | #[cfg(feature = "experimental")] |
768 | | impl<M, H, P> BoundDataProvider<M> for AnyCalendarProvider<H, P> |
769 | | where |
770 | | M: DataMarker, |
771 | | H: CalMarkers<M>, |
772 | | P: Sized |
773 | | + DataProvider<H::Buddhist> |
774 | | + DataProvider<H::Chinese> |
775 | | + DataProvider<H::Coptic> |
776 | | + DataProvider<H::Dangi> |
777 | | + DataProvider<H::Ethiopian> |
778 | | + DataProvider<H::EthiopianAmeteAlem> |
779 | | + DataProvider<H::Gregorian> |
780 | | + DataProvider<H::Hebrew> |
781 | | + DataProvider<H::Indian> |
782 | | + DataProvider<H::IslamicCivil> |
783 | | + DataProvider<H::IslamicObservational> |
784 | | + DataProvider<H::IslamicTabular> |
785 | | + DataProvider<H::IslamicUmmAlQura> |
786 | | + DataProvider<H::Japanese> |
787 | | + DataProvider<H::JapaneseExtended> |
788 | | + DataProvider<H::Persian> |
789 | | + DataProvider<H::Roc>, |
790 | | { |
791 | | fn load_bound(&self, req: DataRequest) -> Result<DataResponse<M>, DataError> { |
792 | | use AnyCalendarKind::*; |
793 | | let p = &self.provider; |
794 | | match self.kind { |
795 | | Buddhist => H::Buddhist::bind(p).load_bound(req), |
796 | | Chinese => H::Chinese::bind(p).load_bound(req), |
797 | | Coptic => H::Coptic::bind(p).load_bound(req), |
798 | | Dangi => H::Dangi::bind(p).load_bound(req), |
799 | | Ethiopian => H::Ethiopian::bind(p).load_bound(req), |
800 | | EthiopianAmeteAlem => H::EthiopianAmeteAlem::bind(p).load_bound(req), |
801 | | Gregorian => H::Gregorian::bind(p).load_bound(req), |
802 | | Hebrew => H::Hebrew::bind(p).load_bound(req), |
803 | | Indian => H::Indian::bind(p).load_bound(req), |
804 | | IslamicCivil => H::IslamicCivil::bind(p).load_bound(req), |
805 | | IslamicObservational => H::IslamicObservational::bind(p).load_bound(req), |
806 | | IslamicTabular => H::IslamicTabular::bind(p).load_bound(req), |
807 | | IslamicUmmAlQura => H::IslamicUmmAlQura::bind(p).load_bound(req), |
808 | | Japanese => H::Japanese::bind(p).load_bound(req), |
809 | | JapaneseExtended => H::JapaneseExtended::bind(p).load_bound(req), |
810 | | Persian => H::Persian::bind(p).load_bound(req), |
811 | | Roc => H::Roc::bind(p).load_bound(req), |
812 | | _ => Err( |
813 | | DataError::custom("Don't know how to load data for specified calendar") |
814 | | .with_debug_context(&self.kind), |
815 | | ), |
816 | | } |
817 | | } |
818 | | fn bound_key(&self) -> DataKey { |
819 | | use AnyCalendarKind::*; |
820 | | match self.kind { |
821 | | Buddhist => H::Buddhist::KEY, |
822 | | Chinese => H::Chinese::KEY, |
823 | | Coptic => H::Coptic::KEY, |
824 | | Dangi => H::Dangi::KEY, |
825 | | Ethiopian => H::Ethiopian::KEY, |
826 | | EthiopianAmeteAlem => H::EthiopianAmeteAlem::KEY, |
827 | | Gregorian => H::Gregorian::KEY, |
828 | | Hebrew => H::Hebrew::KEY, |
829 | | Indian => H::Indian::KEY, |
830 | | IslamicCivil => H::IslamicCivil::KEY, |
831 | | IslamicObservational => H::IslamicObservational::KEY, |
832 | | IslamicTabular => H::IslamicTabular::KEY, |
833 | | IslamicUmmAlQura => H::IslamicUmmAlQura::KEY, |
834 | | Japanese => H::Japanese::KEY, |
835 | | JapaneseExtended => H::JapaneseExtended::KEY, |
836 | | Persian => H::Persian::KEY, |
837 | | Roc => H::Roc::KEY, |
838 | | _ => NeverMarker::<M::Yokeable>::KEY, |
839 | | } |
840 | | } |
841 | | } |
842 | | |
843 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
844 | | macro_rules! impl_load_any_calendar { |
845 | | ([$(($erased:ident, $marker:ident)),+], [$($kind_cal:ident),+], [$($kind:ident => $cal:ident),+]) => { |
846 | | impl_load_any_calendar!(@expand [$(($erased, $marker)),+], [$($kind_cal),+], [$($kind => $cal),+]); |
847 | | }; |
848 | | (@expand [$(($erased:ident, $marker:ident)),+], $tail1:tt, $tail2:tt) => { |
849 | | $(impl_load_any_calendar!(@single_impl $erased, $marker, $tail1, $tail2);)+ |
850 | | }; |
851 | | (@single_impl $erased:ident, $marker:ident, [$($kind_cal:ident),+], [$($kind:ident => $cal:ident),+]) => { |
852 | | impl CalMarkers<$erased> for FullDataCalMarkers { |
853 | | $( |
854 | | type $kind_cal = <$kind_cal as CldrCalendar>::$marker; |
855 | | )+ |
856 | | $( |
857 | | type $kind = <$cal as CldrCalendar>::$marker; |
858 | | )+ |
859 | | } |
860 | | }; |
861 | | } |
862 | | |
863 | | #[cfg(any(feature = "datagen", feature = "experimental"))] |
864 | | impl_load_any_calendar!([ |
865 | | (DatePatternV1Marker, DatePatternV1Marker), |
866 | | (YearNamesV1Marker, YearNamesV1Marker), |
867 | | (MonthNamesV1Marker, MonthNamesV1Marker), |
868 | | (SkeletaV1Marker, SkeletaV1Marker) |
869 | | ], [ |
870 | | Buddhist, |
871 | | Chinese, |
872 | | Coptic, |
873 | | Dangi, |
874 | | Ethiopian, |
875 | | Gregorian, |
876 | | Hebrew, |
877 | | Indian, |
878 | | IslamicCivil, |
879 | | IslamicObservational, |
880 | | IslamicTabular, |
881 | | IslamicUmmAlQura, |
882 | | Japanese, |
883 | | JapaneseExtended, |
884 | | Persian, |
885 | | Roc |
886 | | ], [ |
887 | | EthiopianAmeteAlem => Ethiopian |
888 | | ]); |
889 | | |
890 | | /// Converts a date to the correct calendar if necessary |
891 | | /// |
892 | | /// Returns `Err` if the date is not ISO or compatible with the current calendar, returns `Ok(None)` |
893 | | /// if the date is compatible with the current calendar and doesn't need conversion |
894 | 0 | pub(crate) fn convert_if_necessary<'a>( |
895 | 0 | any_calendar: &'a AnyCalendar, |
896 | 0 | value: &impl crate::input::DateInput<Calendar = AnyCalendar>, |
897 | 0 | ) -> Result< |
898 | 0 | Option<icu_calendar::Date<icu_calendar::Ref<'a, AnyCalendar>>>, |
899 | 0 | crate::MismatchedCalendarError, |
900 | 0 | > { |
901 | 0 | let this_kind = any_calendar.kind(); |
902 | 0 | let date_kind = value.any_calendar_kind(); |
903 | | |
904 | 0 | if Some(this_kind) != date_kind { |
905 | 0 | if date_kind != Some(AnyCalendarKind::Iso) { |
906 | 0 | return Err(crate::MismatchedCalendarError { |
907 | 0 | this_kind, |
908 | 0 | date_kind, |
909 | 0 | }); |
910 | 0 | } |
911 | 0 | let date = value.to_iso().to_any(); |
912 | 0 | let converted = any_calendar.convert_any_date(&date); |
913 | 0 | Ok(Some(converted)) |
914 | | } else { |
915 | 0 | Ok(None) |
916 | | } |
917 | 0 | } Unexecuted instantiation: icu_datetime::calendar::convert_if_necessary::<icu_calendar::date::Date<alloc::sync::Arc<icu_calendar::any_calendar::AnyCalendar>>> Unexecuted instantiation: icu_datetime::calendar::convert_if_necessary::<icu_calendar::date::Date<icu_calendar::any_calendar::AnyCalendar>> Unexecuted instantiation: icu_datetime::calendar::convert_if_necessary::<icu_calendar::datetime::DateTime<alloc::sync::Arc<icu_calendar::any_calendar::AnyCalendar>>> Unexecuted instantiation: icu_datetime::calendar::convert_if_necessary::<icu_calendar::datetime::DateTime<icu_calendar::any_calendar::AnyCalendar>> Unexecuted instantiation: icu_datetime::calendar::convert_if_necessary::<_> |
918 | | |
919 | | /// Converts a date to the correct calendar if necessary |
920 | | /// |
921 | | /// Returns `Err` if the date is not ISO or compatible with the current calendar, returns `Ok(None)` |
922 | | /// if the date is compatible with the current calendar and doesn't need conversion |
923 | 0 | pub(crate) fn convert_datetime_if_necessary<'a>( |
924 | 0 | any_calendar: &'a AnyCalendar, |
925 | 0 | value: &impl crate::input::DateTimeInput<Calendar = AnyCalendar>, |
926 | 0 | ) -> Result< |
927 | 0 | Option<icu_calendar::DateTime<icu_calendar::Ref<'a, AnyCalendar>>>, |
928 | 0 | crate::MismatchedCalendarError, |
929 | 0 | > { |
930 | 0 | let this_kind = any_calendar.kind(); |
931 | 0 | let date_kind = value.any_calendar_kind(); |
932 | | |
933 | 0 | if Some(this_kind) != date_kind { |
934 | 0 | if date_kind != Some(AnyCalendarKind::Iso) { |
935 | 0 | return Err(crate::MismatchedCalendarError { |
936 | 0 | this_kind, |
937 | 0 | date_kind, |
938 | 0 | }); |
939 | 0 | } |
940 | 0 | let date = value.to_iso(); |
941 | 0 | let time = icu_calendar::Time::new( |
942 | 0 | value.hour().unwrap_or_default(), |
943 | 0 | value.minute().unwrap_or_default(), |
944 | 0 | value.second().unwrap_or_default(), |
945 | 0 | value.nanosecond().unwrap_or_default(), |
946 | | ); |
947 | 0 | let datetime = icu_calendar::DateTime::new(date, time).to_any(); |
948 | 0 | let converted = any_calendar.convert_any_datetime(&datetime); |
949 | 0 | Ok(Some(converted)) |
950 | | } else { |
951 | 0 | Ok(None) |
952 | | } |
953 | 0 | } Unexecuted instantiation: icu_datetime::calendar::convert_datetime_if_necessary::<icu_calendar::datetime::DateTime<alloc::sync::Arc<icu_calendar::any_calendar::AnyCalendar>>> Unexecuted instantiation: icu_datetime::calendar::convert_datetime_if_necessary::<icu_calendar::datetime::DateTime<icu_calendar::any_calendar::AnyCalendar>> Unexecuted instantiation: icu_datetime::calendar::convert_datetime_if_necessary::<_> |