Coverage Report

Created: 2026-03-31 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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::<_>