icu_datetime/scaffold/
fieldset_traits.rs

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
5use crate::{
6    provider::{neo::*, time_zones::tz, *},
7    scaffold::*,
8};
9use icu_calendar::{
10    provider::{CalendarChineseV1, CalendarDangiV1, CalendarJapaneseModernV1},
11    types::{DayOfMonth, DayOfYear, MonthInfo, Weekday, YearInfo},
12};
13use icu_decimal::provider::{DecimalDigitsV1, DecimalSymbolsV1};
14use icu_provider::{marker::NeverMarker, prelude::*};
15use icu_time::{scaffold::IntoOption, zone::ZoneNameTimestamp};
16use icu_time::{
17    zone::{TimeZoneVariant, UtcOffset},
18    Hour, Minute, Nanosecond, Second, TimeZone,
19};
20
21// TODO(#4340): Add DecimalFormatter optional bindings here
22
23/// A trait associating types for date formatting in any calendar
24/// (input types only).
25///
26/// This is a sealed trait implemented on field set markers.
27///
28/// <div class="stab unstable">
29/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
30/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
31/// </div>
32pub trait DateInputMarkers: UnstableSealed {
33    /// Marker for resolving the year input field.
34    type YearInput: IntoOption<YearInfo>;
35    /// Marker for resolving the month input field.
36    type MonthInput: IntoOption<MonthInfo>;
37    /// Marker for resolving the day-of-month input field.
38    type DayOfMonthInput: IntoOption<DayOfMonth>;
39    /// Marker for resolving the day-of-year input field.
40    type DayOfYearInput: IntoOption<DayOfYear>;
41    /// Marker for resolving the day-of-week input field.
42    type DayOfWeekInput: IntoOption<Weekday>;
43}
44
45/// A trait associating types for date formatting in a specific calendar
46/// (data markers only).
47///
48/// This is a sealed trait implemented on field set markers.
49///
50/// <div class="stab unstable">
51/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
52/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
53/// </div>
54pub trait TypedDateDataMarkers<C>: UnstableSealed {
55    /// Marker for loading date skeleton patterns.
56    type DateSkeletonPatternsV1: DataMarker<DataStruct = PackedPatterns<'static>>;
57    /// Marker for loading year names.
58    type YearNamesV1: DataMarker<DataStruct = YearNames<'static>>;
59    /// Marker for loading month names.
60    type MonthNamesV1: DataMarker<DataStruct = MonthNames<'static>>;
61    /// Marker for loading weekday names.
62    type WeekdayNamesV1: DataMarker<DataStruct = LinearNames<'static>>;
63}
64
65/// A trait associating types for date formatting in any calendar
66/// (data markers only).
67///
68/// This is a sealed trait implemented on field set markers.
69///
70/// <div class="stab unstable">
71/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
72/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
73/// </div>
74pub trait DateDataMarkers: UnstableSealed {
75    /// Cross-calendar data markers for date skeleta.
76    type Skel: CalMarkers<ErasedPackedPatterns>;
77    /// Cross-calendar data markers for year names.
78    type Year: CalMarkers<YearNamesV1>;
79    /// Cross-calendar data markers for month names.
80    type Month: CalMarkers<MonthNamesV1>;
81    /// Marker for loading weekday names.
82    type WeekdayNamesV1: DataMarker<DataStruct = LinearNames<'static>>;
83}
84
85/// A trait associating types for time formatting
86/// (input types and data markers).
87///
88/// This is a sealed trait implemented on field set markers.
89///
90/// <div class="stab unstable">
91/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
92/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
93/// </div>
94pub trait TimeMarkers: UnstableSealed {
95    /// Marker for resolving the day-of-month input field.
96    type HourInput: IntoOption<Hour>;
97    /// Marker for resolving the day-of-week input field.
98    type MinuteInput: IntoOption<Minute>;
99    /// Marker for resolving the day-of-year input field.
100    type SecondInput: IntoOption<Second>;
101    /// Marker for resolving the any-calendar-kind input field.
102    type NanosecondInput: IntoOption<Nanosecond>;
103    /// Marker for loading time skeleton patterns.
104    type TimeSkeletonPatternsV1: DataMarker<DataStruct = PackedPatterns<'static>>;
105    /// Marker for loading day period names.
106    type DayPeriodNamesV1: DataMarker<DataStruct = LinearNames<'static>>;
107}
108
109/// A trait associating types for time zone formatting
110/// (input types and data markers).
111///
112/// This is a sealed trait implemented on field set markers.
113///
114/// <div class="stab unstable">
115/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
116/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
117/// </div>
118pub trait ZoneMarkers: UnstableSealed {
119    /// Marker for resolving the time zone id input field.
120    type TimeZoneIdInput: IntoOption<TimeZone>;
121    /// Marker for resolving the time zone offset input field.
122    type TimeZoneOffsetInput: IntoOption<UtcOffset>;
123    /// Marker for resolving the time zone variant input field.
124    type TimeZoneVariantInput: IntoOption<TimeZoneVariant>;
125    /// Marker for resolving the time zone non-location display names, which depend on the datetime.
126    type TimeZoneNameTimestampInput: IntoOption<ZoneNameTimestamp>;
127    /// Marker for loading core time zone data.
128    type EssentialsV1: DataMarker<DataStruct = tz::Essentials<'static>>;
129    /// Marker for loading location names for time zone formatting
130    type LocationsV1: DataMarker<DataStruct = tz::Locations<'static>>;
131    /// Marker for loading location names for time zone formatting
132    type LocationsRootV1: DataMarker<DataStruct = tz::Locations<'static>>;
133    /// Marker for loading exemplar city names for time zone formatting
134    type ExemplarCitiesV1: DataMarker<DataStruct = tz::ExemplarCities<'static>>;
135    /// Marker for loading exemplar city names for time zone formatting
136    type ExemplarCitiesRootV1: DataMarker<DataStruct = tz::ExemplarCities<'static>>;
137    /// Marker for loading generic long time zone names.
138    type GenericLongV1: DataMarker<DataStruct = tz::MzGeneric<'static>>;
139    /// Marker for loading generic short time zone names.
140    type GenericShortV1: DataMarker<DataStruct = tz::MzGeneric<'static>>;
141    /// Marker for loading standard long time zone names.
142    type StandardLongV1: DataMarker<DataStruct = tz::MzGeneric<'static>>;
143    /// Marker for loading specific long time zone names.
144    type SpecificLongV1: DataMarker<DataStruct = tz::MzSpecific<'static>>;
145    /// Marker for loading generic short time zone names.
146    type SpecificShortV1: DataMarker<DataStruct = tz::MzSpecific<'static>>;
147    /// Marker for loading metazone periods.
148    type MetazonePeriodV1: DataMarker<DataStruct = tz::MzPeriod<'static>>;
149}
150
151/// A trait associating constants and types implementing various other traits
152/// required for datetime formatting.
153///
154/// This is a sealed trait implemented on field set markers.
155///
156/// <div class="stab unstable">
157/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
158/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
159/// </div>
160pub trait DateTimeMarkers: UnstableSealed + DateTimeNamesMarker {
161    /// Associated types for date formatting.
162    ///
163    /// Should implement [`DateDataMarkers`], [`TypedDateDataMarkers`], and [`DateInputMarkers`].
164    type D;
165    /// Associated types for time formatting.
166    ///
167    /// Should implement [`TimeMarkers`].
168    type T;
169    /// Associated types for time zone formatting.
170    ///
171    /// Should implement [`ZoneMarkers`].
172    type Z;
173    /// Marker for loading the date/time glue pattern.
174    type GluePatternV1: DataMarker<DataStruct = GluePattern<'static>>;
175}
176
177/// Trait implemented on formattable datetime types.
178///
179/// This trait allows for only those types compatible with a particular field set to be passed
180/// as arguments to the formatting function for that field set. For example, this trait prevents
181/// [`Time`] from being passed to a formatter parameterized with [`fieldsets::YMD`].
182///
183/// The following types implement this trait:
184///
185/// - [`Date`](icu_calendar::Date)
186/// - [`Time`](icu_time::Time)
187/// - [`DateTime`](icu_time::DateTime)
188/// - [`ZonedDateTime`](icu_time::ZonedDateTime)
189/// - [`UtcOffset`](icu_time::zone::UtcOffset)
190/// - [`TimeZoneInfo`](icu_time::TimeZoneInfo)
191///
192/// [`fieldsets::YMD`]: crate::fieldsets::YMD
193/// [`Time`]: icu_time::Time
194// This trait is implicitly sealed due to sealed supertraits
195pub trait AllInputMarkers<R: DateTimeMarkers>:
196    GetField<<R::D as DateInputMarkers>::YearInput>
197    + GetField<<R::D as DateInputMarkers>::MonthInput>
198    + GetField<<R::D as DateInputMarkers>::DayOfMonthInput>
199    + GetField<<R::D as DateInputMarkers>::DayOfWeekInput>
200    + GetField<<R::D as DateInputMarkers>::DayOfYearInput>
201    + GetField<<R::T as TimeMarkers>::HourInput>
202    + GetField<<R::T as TimeMarkers>::MinuteInput>
203    + GetField<<R::T as TimeMarkers>::SecondInput>
204    + GetField<<R::T as TimeMarkers>::NanosecondInput>
205    + GetField<<R::Z as ZoneMarkers>::TimeZoneIdInput>
206    + GetField<<R::Z as ZoneMarkers>::TimeZoneOffsetInput>
207    + GetField<<R::Z as ZoneMarkers>::TimeZoneVariantInput>
208    + GetField<<R::Z as ZoneMarkers>::TimeZoneNameTimestampInput>
209where
210    R::D: DateInputMarkers,
211    R::T: TimeMarkers,
212    R::Z: ZoneMarkers,
213{
214}
215
216impl<T, R> AllInputMarkers<R> for T
217where
218    R: DateTimeMarkers,
219    R::D: DateInputMarkers,
220    R::T: TimeMarkers,
221    R::Z: ZoneMarkers,
222    T: GetField<<R::D as DateInputMarkers>::YearInput>
223        + GetField<<R::D as DateInputMarkers>::MonthInput>
224        + GetField<<R::D as DateInputMarkers>::DayOfMonthInput>
225        + GetField<<R::D as DateInputMarkers>::DayOfWeekInput>
226        + GetField<<R::D as DateInputMarkers>::DayOfYearInput>
227        + GetField<<R::T as TimeMarkers>::HourInput>
228        + GetField<<R::T as TimeMarkers>::MinuteInput>
229        + GetField<<R::T as TimeMarkers>::SecondInput>
230        + GetField<<R::T as TimeMarkers>::NanosecondInput>
231        + GetField<<R::Z as ZoneMarkers>::TimeZoneIdInput>
232        + GetField<<R::Z as ZoneMarkers>::TimeZoneOffsetInput>
233        + GetField<<R::Z as ZoneMarkers>::TimeZoneVariantInput>
234        + GetField<<R::Z as ZoneMarkers>::TimeZoneNameTimestampInput>,
235{
236}
237
238/// Trait to consolidate data provider markers defined by this crate
239/// for datetime skeleton patterns with a fixed calendar.
240///
241/// This trait is implemented on all providers that support datetime skeleton patterns,
242/// including [`crate::provider::Baked`].
243// This trait is implicitly sealed due to sealed supertraits
244#[rustfmt::skip]
245pub trait AllFixedCalendarPatternDataMarkers<C: CldrCalendar, FSet: DateTimeMarkers>:
246DataProvider<<FSet::D as TypedDateDataMarkers<C>>::DateSkeletonPatternsV1>
247    + DataProvider<<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1>
248    + DataProvider<FSet::GluePatternV1>
249where
250    FSet::D: TypedDateDataMarkers<C>,
251    FSet::T: TimeMarkers,
252    FSet::Z: ZoneMarkers,
253{
254}
255
256#[rustfmt::skip]
257impl<T, C, FSet> AllFixedCalendarPatternDataMarkers<C, FSet> for T
258where
259    C: CldrCalendar,
260    FSet: DateTimeMarkers,
261    FSet::D: TypedDateDataMarkers<C>,
262    FSet::T: TimeMarkers,
263    FSet::Z: ZoneMarkers,
264    T: ?Sized
265        + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::DateSkeletonPatternsV1>
266        + DataProvider<<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1>
267        + DataProvider<FSet::GluePatternV1>,
268{
269}
270
271/// Trait to consolidate data provider markers defined by this crate
272/// for datetime formatting with a fixed calendar.
273///
274/// This trait is implemented on all providers that support datetime formatting,
275/// including [`crate::provider::Baked`].
276// This trait is implicitly sealed due to sealed supertraits
277#[rustfmt::skip]
278pub trait AllFixedCalendarFormattingDataMarkers<C: CldrCalendar, FSet: DateTimeMarkers>:
279    DataProvider<<FSet::D as TypedDateDataMarkers<C>>::YearNamesV1>
280    + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::MonthNamesV1>
281    + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::WeekdayNamesV1>
282    + DataProvider<<FSet::T as TimeMarkers>::DayPeriodNamesV1>
283    + DataProvider<<FSet::Z as ZoneMarkers>::EssentialsV1>
284    + DataProvider<<FSet::Z as ZoneMarkers>::LocationsV1>
285    + DataProvider<<FSet::Z as ZoneMarkers>::LocationsRootV1>
286    + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesV1>
287    + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1>
288    + DataProvider<<FSet::Z as ZoneMarkers>::GenericLongV1>
289    + DataProvider<<FSet::Z as ZoneMarkers>::GenericShortV1>
290    + DataProvider<<FSet::Z as ZoneMarkers>::StandardLongV1>
291    + DataProvider<<FSet::Z as ZoneMarkers>::SpecificLongV1>
292    + DataProvider<<FSet::Z as ZoneMarkers>::SpecificShortV1>
293    + DataProvider<<FSet::Z as ZoneMarkers>::MetazonePeriodV1>
294    + AllFixedCalendarPatternDataMarkers<C, FSet>
295where
296    FSet::D: TypedDateDataMarkers<C>,
297    FSet::T: TimeMarkers,
298    FSet::Z: ZoneMarkers,
299{
300}
301
302#[rustfmt::skip]
303impl<T, C, FSet> AllFixedCalendarFormattingDataMarkers<C, FSet> for T
304where
305    C: CldrCalendar,
306    FSet: DateTimeMarkers,
307    FSet::D: TypedDateDataMarkers<C>,
308    FSet::T: TimeMarkers,
309    FSet::Z: ZoneMarkers,
310    T: ?Sized
311        + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::YearNamesV1>
312        + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::MonthNamesV1>
313        + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::DateSkeletonPatternsV1>
314        + DataProvider<<FSet::D as TypedDateDataMarkers<C>>::WeekdayNamesV1>
315        + DataProvider<<FSet::T as TimeMarkers>::DayPeriodNamesV1>
316        + DataProvider<<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1>
317        + DataProvider<<FSet::Z as ZoneMarkers>::EssentialsV1>
318        + DataProvider<<FSet::Z as ZoneMarkers>::LocationsV1>
319        + DataProvider<<FSet::Z as ZoneMarkers>::LocationsRootV1>
320        + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesV1>
321        + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1>
322        + DataProvider<<FSet::Z as ZoneMarkers>::GenericLongV1>
323        + DataProvider<<FSet::Z as ZoneMarkers>::GenericShortV1>
324        + DataProvider<<FSet::Z as ZoneMarkers>::StandardLongV1>
325        + DataProvider<<FSet::Z as ZoneMarkers>::SpecificLongV1>
326        + DataProvider<<FSet::Z as ZoneMarkers>::SpecificShortV1>
327        + DataProvider<<FSet::Z as ZoneMarkers>::MetazonePeriodV1>
328        + DataProvider<FSet::GluePatternV1>
329        + AllFixedCalendarPatternDataMarkers<C, FSet>
330{
331}
332
333/// Trait to consolidate data provider markers defined by this crate
334/// for datetime skeleton patterns with any calendar.
335///
336/// This trait is implemented on all providers that support datetime skeleton patterns,
337/// including [`crate::provider::Baked`].
338// This trait is implicitly sealed due to sealed supertraits
339#[rustfmt::skip]
340pub trait AllAnyCalendarPatternDataMarkers<FSet: DateTimeMarkers>:
341    DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Buddhist>
342    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Chinese>
343    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Coptic>
344    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Dangi>
345    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Ethiopian>
346    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Gregorian>
347    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Hebrew>
348    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Indian>
349    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Hijri>
350    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Japanese>
351    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Persian>
352    + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Roc>
353    + DataProvider<<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1>
354    + DataProvider<FSet::GluePatternV1>
355where
356    FSet::D: DateDataMarkers,
357    FSet::T: TimeMarkers,
358    FSet::Z: ZoneMarkers,
359{
360}
361
362#[rustfmt::skip]
363impl<T, FSet> AllAnyCalendarPatternDataMarkers<FSet> for T
364where
365    FSet: DateTimeMarkers,
366    FSet::D: DateDataMarkers,
367    FSet::T: TimeMarkers,
368    FSet::Z: ZoneMarkers,
369    T: ?Sized
370        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Buddhist>
371        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Chinese>
372        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Coptic>
373        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Dangi>
374        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Ethiopian>
375        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Gregorian>
376        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Hebrew>
377        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Indian>
378        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Hijri>
379        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Japanese>
380        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Persian>
381        + DataProvider<<<FSet::D as DateDataMarkers>::Skel as CalMarkers<ErasedPackedPatterns>>::Roc>
382        + DataProvider<<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1>
383        + DataProvider<FSet::GluePatternV1>
384{
385}
386
387/// Trait to consolidate data provider markers defined by this crate
388/// for datetime formatting with any calendar.
389///
390/// This trait is implemented on all providers that support datetime formatting,
391/// including [`crate::provider::Baked`].
392// This trait is implicitly sealed due to sealed supertraits
393#[rustfmt::skip]
394pub trait AllAnyCalendarFormattingDataMarkers<FSet: DateTimeMarkers>:
395    DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Buddhist>
396    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Chinese>
397    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Coptic>
398    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Dangi>
399    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Ethiopian>
400    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Gregorian>
401    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Hebrew>
402    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Indian>
403    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Hijri>
404    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Japanese>
405    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Persian>
406    + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Roc>
407    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Buddhist>
408    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Chinese>
409    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Coptic>
410    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Dangi>
411    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Ethiopian>
412    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Gregorian>
413    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Hebrew>
414    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Indian>
415    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Hijri>
416    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Japanese>
417    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Persian>
418    + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Roc>
419    + DataProvider<<FSet::D as DateDataMarkers>::WeekdayNamesV1>
420    + DataProvider<<FSet::T as TimeMarkers>::DayPeriodNamesV1>
421    + DataProvider<<FSet::Z as ZoneMarkers>::EssentialsV1>
422    + DataProvider<<FSet::Z as ZoneMarkers>::LocationsV1>
423    + DataProvider<<FSet::Z as ZoneMarkers>::LocationsRootV1>
424    + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesV1>
425    + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1>
426    + DataProvider<<FSet::Z as ZoneMarkers>::GenericLongV1>
427    + DataProvider<<FSet::Z as ZoneMarkers>::GenericShortV1>
428    + DataProvider<<FSet::Z as ZoneMarkers>::StandardLongV1>
429    + DataProvider<<FSet::Z as ZoneMarkers>::SpecificLongV1>
430    + DataProvider<<FSet::Z as ZoneMarkers>::SpecificShortV1>
431    + DataProvider<<FSet::Z as ZoneMarkers>::MetazonePeriodV1>
432    + AllAnyCalendarPatternDataMarkers<FSet>
433where
434    FSet::D: DateDataMarkers,
435    FSet::T: TimeMarkers,
436    FSet::Z: ZoneMarkers,
437{
438}
439
440#[rustfmt::skip]
441impl<T, FSet> AllAnyCalendarFormattingDataMarkers<FSet> for T
442where
443    FSet: DateTimeMarkers,
444    FSet::D: DateDataMarkers,
445    FSet::T: TimeMarkers,
446    FSet::Z: ZoneMarkers,
447    T: ?Sized
448        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Buddhist>
449        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Chinese>
450        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Coptic>
451        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Dangi>
452        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Ethiopian>
453        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Gregorian>
454        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Hebrew>
455        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Indian>
456        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Hijri>
457        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Japanese>
458        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Persian>
459        + DataProvider<<<FSet::D as DateDataMarkers>::Year as CalMarkers<YearNamesV1>>::Roc>
460        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Buddhist>
461        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Chinese>
462        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Coptic>
463        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Dangi>
464        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Ethiopian>
465        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Gregorian>
466        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Hebrew>
467        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Indian>
468        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Hijri>
469        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Japanese>
470        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Persian>
471        + DataProvider<<<FSet::D as DateDataMarkers>::Month as CalMarkers<MonthNamesV1>>::Roc>
472        + DataProvider<<FSet::D as DateDataMarkers>::WeekdayNamesV1>
473        + DataProvider<<FSet::T as TimeMarkers>::DayPeriodNamesV1>
474        + DataProvider<<FSet::Z as ZoneMarkers>::EssentialsV1>
475        + DataProvider<<FSet::Z as ZoneMarkers>::LocationsV1>
476        + DataProvider<<FSet::Z as ZoneMarkers>::LocationsRootV1>
477        + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesV1>
478        + DataProvider<<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1>
479        + DataProvider<<FSet::Z as ZoneMarkers>::GenericLongV1>
480        + DataProvider<<FSet::Z as ZoneMarkers>::GenericShortV1>
481        + DataProvider<<FSet::Z as ZoneMarkers>::StandardLongV1>
482        + DataProvider<<FSet::Z as ZoneMarkers>::SpecificLongV1>
483        + DataProvider<<FSet::Z as ZoneMarkers>::SpecificShortV1>
484        + DataProvider<<FSet::Z as ZoneMarkers>::MetazonePeriodV1>
485        + AllAnyCalendarPatternDataMarkers<FSet>
486{
487}
488
489/// Trait to consolidate data provider markers external to this crate
490/// for datetime formatting with a fixed calendar.
491// This trait is implicitly sealed due to sealed supertraits
492pub trait AllFixedCalendarExternalDataMarkers:
493    DataProvider<DecimalSymbolsV1> + DataProvider<DecimalDigitsV1>
494{
495}
496
497impl<T> AllFixedCalendarExternalDataMarkers for T where
498    T: ?Sized + DataProvider<DecimalSymbolsV1> + DataProvider<DecimalDigitsV1>
499{
500}
501
502/// Trait to consolidate data provider markers external to this crate
503/// for datetime formatting with any calendar.
504// This trait is implicitly sealed due to sealed supertraits
505pub trait AllAnyCalendarExternalDataMarkers:
506    DataProvider<CalendarChineseV1>
507    + DataProvider<CalendarDangiV1>
508    + DataProvider<CalendarJapaneseModernV1>
509    + DataProvider<DecimalSymbolsV1>
510    + DataProvider<DecimalDigitsV1>
511{
512}
513
514impl<T> AllAnyCalendarExternalDataMarkers for T where
515    T: ?Sized
516        + DataProvider<CalendarChineseV1>
517        + DataProvider<CalendarDangiV1>
518        + DataProvider<CalendarJapaneseModernV1>
519        + DataProvider<DecimalSymbolsV1>
520        + DataProvider<DecimalDigitsV1>
521{
522}
523
524impl DateInputMarkers for () {
525    type YearInput = ();
526    type MonthInput = ();
527    type DayOfMonthInput = ();
528    type DayOfYearInput = ();
529    type DayOfWeekInput = ();
530}
531
532impl<C> TypedDateDataMarkers<C> for () {
533    type DateSkeletonPatternsV1 = NeverMarker<PackedPatterns<'static>>;
534    type YearNamesV1 = NeverMarker<YearNames<'static>>;
535    type MonthNamesV1 = NeverMarker<MonthNames<'static>>;
536    type WeekdayNamesV1 = NeverMarker<LinearNames<'static>>;
537}
538
539impl DateDataMarkers for () {
540    type Skel = NoDataCalMarkers;
541    type Year = NoDataCalMarkers;
542    type Month = NoDataCalMarkers;
543    type WeekdayNamesV1 = NeverMarker<LinearNames<'static>>;
544}
545
546impl TimeMarkers for () {
547    type HourInput = ();
548    type MinuteInput = ();
549    type SecondInput = ();
550    type NanosecondInput = ();
551    type TimeSkeletonPatternsV1 = NeverMarker<PackedPatterns<'static>>;
552    type DayPeriodNamesV1 = NeverMarker<LinearNames<'static>>;
553}
554
555impl ZoneMarkers for () {
556    type TimeZoneIdInput = ();
557    type TimeZoneOffsetInput = ();
558    type TimeZoneVariantInput = ();
559    type TimeZoneNameTimestampInput = ();
560    type EssentialsV1 = NeverMarker<tz::Essentials<'static>>;
561    type LocationsV1 = NeverMarker<tz::Locations<'static>>;
562    type LocationsRootV1 = NeverMarker<tz::Locations<'static>>;
563    type ExemplarCitiesV1 = NeverMarker<tz::ExemplarCities<'static>>;
564    type ExemplarCitiesRootV1 = NeverMarker<tz::ExemplarCities<'static>>;
565    type GenericLongV1 = NeverMarker<tz::MzGeneric<'static>>;
566    type GenericShortV1 = NeverMarker<tz::MzGeneric<'static>>;
567    type StandardLongV1 = NeverMarker<tz::MzGeneric<'static>>;
568    type SpecificLongV1 = NeverMarker<tz::MzSpecific<'static>>;
569    type SpecificShortV1 = NeverMarker<tz::MzSpecific<'static>>;
570    type MetazonePeriodV1 = NeverMarker<tz::MzPeriod<'static>>;
571}
572
573macro_rules! datetime_marker_helper {
574    (@years/typed, yes) => {
575        C::YearNamesV1
576    };
577    (@years/typed,) => {
578        NeverMarker<YearNames<'static>>
579    };
580    (@months/typed, yes) => {
581        C::MonthNamesV1
582    };
583    (@months/typed,) => {
584        NeverMarker<MonthNames<'static>>
585    };
586    (@dates/typed, yes) => {
587        C::SkeletaV1
588    };
589    (@dates/typed,) => {
590        NeverMarker<PackedPatterns<'static>>
591    };
592    (@calmarkers, yes) => {
593        FullDataCalMarkers
594    };
595    (@calmarkers,) => {
596        NoDataCalMarkers
597    };
598    (@weekdays, yes) => {
599        WeekdayNamesV1
600    };
601    (@weekdays,) => {
602        NeverMarker<LinearNames<'static>>
603    };
604    (@dayperiods, yes) => {
605        DayPeriodNamesV1
606    };
607    (@dayperiods,) => {
608        NeverMarker<LinearNames<'static>>
609    };
610    (@times, yes) => {
611        DatetimePatternsTimeV1
612    };
613    (@times,) => {
614        NeverMarker<ErasedPackedPatterns>
615    };
616    (@glue, yes) => {
617        DatetimePatternsGlueV1
618    };
619    (@glue,) => {
620        NeverMarker<GluePattern<'static>>
621    };
622    (@option/length, yes) => {
623        Length
624    };
625    (@option/length, long) => {
626        Length
627    };
628    (@option/length, medium) => {
629        Length
630    };
631    (@option/length, short) => {
632        Length
633    };
634    (@option/yearstyle, yes) => {
635        Option<YearStyle>
636    };
637    (@option/alignment, yes) => {
638        Option<Alignment>
639    };
640    (@option/timeprecision, yes) => {
641        Option<TimePrecision>
642    };
643    (@option/$any:ident,) => {
644        ()
645    };
646    (@input/year, yes) => {
647        YearInfo
648    };
649    (@input/month, yes) => {
650        MonthInfo
651    };
652    (@input/day_of_month, yes) => {
653        DayOfMonth
654    };
655    (@input/day_of_week, yes) => {
656        Weekday
657    };
658    (@input/day_of_year, yes) => {
659        DayOfYear
660    };
661    (@input/hour, yes) => {
662        Hour
663    };
664    (@input/minute, yes) => {
665        Minute
666    };
667    (@input/second, yes) => {
668        Second
669    };
670    (@input/Nanosecond, yes) => {
671        Nanosecond
672    };
673    (@input/timezone/id, yes) => {
674        TimeZone
675    };
676    (@input/timezone/offset, yes) => {
677        Option<UtcOffset>
678    };
679    (@input/timezone/variant, yes) => {
680        TimeZoneVariant
681    };
682    (@input/timezone/local_time, yes) => {
683        ZoneNameTimestamp
684    };
685    (@input/timezone/$any:ident,) => {
686        ()
687    };
688    (@input/$any:ident,) => {
689        ()
690    };
691    (@data/zone/essentials, yes) => {
692        tz::EssentialsV1
693    };
694    (@data/zone/locations, yes) => {
695        tz::LocationsOverrideV1
696    };
697    (@data/zone/locations_root, yes) => {
698        tz::LocationsRootV1
699    };
700    (@data/zone/exemplars, yes) => {
701        tz::CitiesOverrideV1
702    };
703    (@data/zone/exemplars_root, yes) => {
704        tz::CitiesRootV1
705    };
706    (@data/zone/generic_long, yes) => {
707        tz::MzGenericLongV1
708    };
709    (@data/zone/generic_short, yes) => {
710        tz::MzGenericShortV1
711    };
712    (@data/zone/standard_long, yes) => {
713        tz::MzStandardLongV1
714    };
715    (@data/zone/specific_long, yes) => {
716        tz::MzSpecificLongV1
717    };
718    (@data/zone/specific_short, yes) => {
719        tz::MzSpecificShortV1
720    };
721    (@data/zone/metazone_periods, yes) => {
722        tz::MzPeriodV1
723    };
724    (@data/zone/essentials,) => {
725        NeverMarker<tz::Essentials<'static>>
726    };
727    (@data/zone/locations,) => {
728        NeverMarker<tz::Locations<'static>>
729    };
730    (@data/zone/locations_root,) => {
731        NeverMarker<tz::Locations<'static>>
732    };
733    (@data/zone/exemplars,) => {
734        NeverMarker<tz::ExemplarCities<'static>>
735    };
736    (@data/zone/exemplars_root,) => {
737        NeverMarker<tz::ExemplarCities<'static>>
738    };
739    (@data/zone/generic_long,) => {
740        NeverMarker<tz::MzGeneric<'static>>
741    };
742    (@data/zone/generic_short,) => {
743        NeverMarker<tz::MzGeneric<'static>>
744    };
745    (@data/zone/standard_long,) => {
746        NeverMarker<tz::MzGeneric<'static>>
747    };
748    (@data/zone/specific_long,) => {
749        NeverMarker<tz::MzSpecific<'static>>
750    };
751    (@data/zone/specific_short,) => {
752        NeverMarker<tz::MzSpecific<'static>>
753    };
754    (@data/zone/metazone_periods,) => {
755        NeverMarker<tz::MzPeriod<'static>>
756    };
757    (@names/year, yes) => {
758        YearNamesV1
759    };
760    (@names/month, yes) => {
761        MonthNamesV1
762    };
763    (@names/weekday, yes) => {
764        WeekdayNamesV1
765    };
766    (@names/dayperiod, yes) => {
767        DayPeriodNamesV1
768    };
769    (@names/zone/essentials, yes) => {
770        tz::EssentialsV1
771    };
772    (@names/zone/locations, yes) => {
773        tz::LocationsOverrideV1
774    };
775    (@names/zone/locations_root, yes) => {
776        tz::LocationsRootV1
777    };
778    (@names/zone/exemplars, yes) => {
779        tz::CitiesOverrideV1
780    };
781    (@names/zone/exemplars_root, yes) => {
782        tz::CitiesRootV1
783    };
784    (@names/zone/generic_long, yes) => {
785        tz::MzGenericLongV1
786    };
787    (@names/zone/generic_short, yes) => {
788        tz::MzGenericShortV1
789    };
790    (@names/zone/standard_long, yes) => {
791        tz::MzStandardLongV1
792    };
793    (@names/zone/specific_long, yes) => {
794        tz::MzSpecificLongV1
795    };
796    (@names/zone/specific_short, yes) => {
797        tz::MzSpecificShortV1
798    };
799    (@names/zone/metazone_periods, yes) => {
800        tz::MzPeriodV1
801    };
802    (@names/$any:ident,) => {
803        ()
804    };
805    (@names/zone/$any:ident,) => {
806        ()
807    };
808    () => {
809        unreachable!() // prevent bugs
810    };
811}
812pub(crate) use datetime_marker_helper;