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