icu_datetime/scaffold/
get_field.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 icu_calendar::{
6    types::{DayOfMonth, DayOfYear, MonthInfo, Weekday, YearInfo},
7    AsCalendar, Calendar, Date,
8};
9use icu_time::{
10    zone::{models::TimeZoneModel, TimeZoneVariant, UtcOffset, ZoneNameTimestamp},
11    DateTime, Hour, Minute, Nanosecond, Second, Time, TimeZone, TimeZoneInfo, ZonedDateTime,
12};
13
14use super::UnstableSealed;
15
16/// A type that can return a certain field `T`.
17///
18/// This is used as a bound on various datetime functions.
19///
20/// <div class="stab unstable">
21/// 🚧 This trait is considered unstable; it may change at any time, in breaking or non-breaking ways,
22/// including in SemVer minor releases. Do not implement this trait in userland unless you are prepared for things to occasionally break.
23/// </div>
24pub trait GetField<T>: UnstableSealed {
25    /// Returns the value of this trait's field `T`.
26    fn get_field(&self) -> T;
27}
28
29impl<T> GetField<T> for T
30where
31    T: Copy + UnstableSealed,
32{
33    #[inline]
34    fn get_field(&self) -> T {
35        *self
36    }
37}
38
39impl<C: Calendar, A: AsCalendar<Calendar = C>> UnstableSealed for Date<A> {}
40
41impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<YearInfo> for Date<A> {
42    #[inline]
43    fn get_field(&self) -> YearInfo {
44        self.year()
45    }
46}
47
48impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<MonthInfo> for Date<A> {
49    #[inline]
50    fn get_field(&self) -> MonthInfo {
51        self.month()
52    }
53}
54
55impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfMonth> for Date<A> {
56    #[inline]
57    fn get_field(&self) -> DayOfMonth {
58        self.day_of_month()
59    }
60}
61
62impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Weekday> for Date<A> {
63    #[inline]
64    fn get_field(&self) -> Weekday {
65        self.day_of_week()
66    }
67}
68
69impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfYear> for Date<A> {
70    #[inline]
71    fn get_field(&self) -> DayOfYear {
72        self.day_of_year()
73    }
74}
75
76impl UnstableSealed for Time {}
77
78impl GetField<Hour> for Time {
79    #[inline]
80    fn get_field(&self) -> Hour {
81        self.hour
82    }
83}
84
85impl GetField<Minute> for Time {
86    #[inline]
87    fn get_field(&self) -> Minute {
88        self.minute
89    }
90}
91
92impl GetField<Second> for Time {
93    #[inline]
94    fn get_field(&self) -> Second {
95        self.second
96    }
97}
98
99impl GetField<Nanosecond> for Time {
100    #[inline]
101    fn get_field(&self) -> Nanosecond {
102        self.subsecond
103    }
104}
105
106impl<C: Calendar, A: AsCalendar<Calendar = C>> UnstableSealed for DateTime<A> {}
107
108impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<YearInfo> for DateTime<A> {
109    #[inline]
110    fn get_field(&self) -> YearInfo {
111        self.date.year()
112    }
113}
114
115impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<MonthInfo> for DateTime<A> {
116    #[inline]
117    fn get_field(&self) -> MonthInfo {
118        self.date.month()
119    }
120}
121
122impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfMonth> for DateTime<A> {
123    #[inline]
124    fn get_field(&self) -> DayOfMonth {
125        self.date.day_of_month()
126    }
127}
128
129impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Weekday> for DateTime<A> {
130    #[inline]
131    fn get_field(&self) -> Weekday {
132        self.date.day_of_week()
133    }
134}
135
136impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfYear> for DateTime<A> {
137    #[inline]
138    fn get_field(&self) -> DayOfYear {
139        self.date.day_of_year()
140    }
141}
142
143impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Hour> for DateTime<A> {
144    #[inline]
145    fn get_field(&self) -> Hour {
146        self.time.hour
147    }
148}
149
150impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Minute> for DateTime<A> {
151    #[inline]
152    fn get_field(&self) -> Minute {
153        self.time.minute
154    }
155}
156
157impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Second> for DateTime<A> {
158    #[inline]
159    fn get_field(&self) -> Second {
160        self.time.second
161    }
162}
163
164impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Nanosecond> for DateTime<A> {
165    #[inline]
166    fn get_field(&self) -> Nanosecond {
167        self.time.subsecond
168    }
169}
170
171impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> UnstableSealed for ZonedDateTime<A, Z> {}
172
173impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<YearInfo> for ZonedDateTime<A, Z> {
174    #[inline]
175    fn get_field(&self) -> YearInfo {
176        self.date.year()
177    }
178}
179
180impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<MonthInfo> for ZonedDateTime<A, Z> {
181    #[inline]
182    fn get_field(&self) -> MonthInfo {
183        self.date.month()
184    }
185}
186
187impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<DayOfMonth> for ZonedDateTime<A, Z> {
188    #[inline]
189    fn get_field(&self) -> DayOfMonth {
190        self.date.day_of_month()
191    }
192}
193
194impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Weekday> for ZonedDateTime<A, Z> {
195    #[inline]
196    fn get_field(&self) -> Weekday {
197        self.date.day_of_week()
198    }
199}
200
201impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<DayOfYear> for ZonedDateTime<A, Z> {
202    #[inline]
203    fn get_field(&self) -> DayOfYear {
204        self.date.day_of_year()
205    }
206}
207
208impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Hour> for ZonedDateTime<A, Z> {
209    #[inline]
210    fn get_field(&self) -> Hour {
211        self.time.hour
212    }
213}
214
215impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Minute> for ZonedDateTime<A, Z> {
216    #[inline]
217    fn get_field(&self) -> Minute {
218        self.time.minute
219    }
220}
221
222impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Second> for ZonedDateTime<A, Z> {
223    #[inline]
224    fn get_field(&self) -> Second {
225        self.time.second
226    }
227}
228
229impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Nanosecond> for ZonedDateTime<A, Z> {
230    #[inline]
231    fn get_field(&self) -> Nanosecond {
232        self.time.subsecond
233    }
234}
235
236impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Option<UtcOffset>>
237    for ZonedDateTime<A, Z>
238where
239    Z: GetField<Option<UtcOffset>>,
240{
241    #[inline]
242    fn get_field(&self) -> Option<UtcOffset> {
243        self.zone.get_field()
244    }
245}
246
247impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<TimeZone> for ZonedDateTime<A, Z>
248where
249    Z: GetField<TimeZone>,
250{
251    #[inline]
252    fn get_field(&self) -> TimeZone {
253        self.zone.get_field()
254    }
255}
256
257impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<TimeZoneVariant> for ZonedDateTime<A, Z>
258where
259    Z: GetField<TimeZoneVariant>,
260{
261    #[inline]
262    fn get_field(&self) -> TimeZoneVariant {
263        self.zone.get_field()
264    }
265}
266
267impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<ZoneNameTimestamp>
268    for ZonedDateTime<A, Z>
269where
270    Z: GetField<ZoneNameTimestamp>,
271{
272    #[inline]
273    fn get_field(&self) -> ZoneNameTimestamp {
274        self.zone.get_field()
275    }
276}
277
278impl UnstableSealed for UtcOffset {}
279
280impl GetField<Option<UtcOffset>> for UtcOffset {
281    #[inline]
282    fn get_field(&self) -> Option<UtcOffset> {
283        Some(*self)
284    }
285}
286
287impl<O: TimeZoneModel> UnstableSealed for TimeZoneInfo<O> {}
288
289impl<O> GetField<TimeZone> for TimeZoneInfo<O>
290where
291    O: TimeZoneModel,
292{
293    #[inline]
294    fn get_field(&self) -> TimeZone {
295        self.id()
296    }
297}
298
299impl<O> GetField<Option<UtcOffset>> for TimeZoneInfo<O>
300where
301    O: TimeZoneModel,
302{
303    #[inline]
304    fn get_field(&self) -> Option<UtcOffset> {
305        self.offset()
306    }
307}
308
309impl<O> GetField<TimeZoneVariant> for TimeZoneInfo<O>
310where
311    O: TimeZoneModel<TimeZoneVariant = TimeZoneVariant>,
312{
313    #[inline]
314    fn get_field(&self) -> TimeZoneVariant {
315        self.variant()
316    }
317}
318
319impl<O> GetField<ZoneNameTimestamp> for TimeZoneInfo<O>
320where
321    O: TimeZoneModel<ZoneNameTimestamp = ZoneNameTimestamp>,
322{
323    #[inline]
324    fn get_field(&self) -> ZoneNameTimestamp {
325        self.zone_name_timestamp()
326    }
327}
328
329impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<()> for Date<A> {
330    #[inline]
331    fn get_field(&self) {}
332}
333
334impl GetField<()> for Time {
335    #[inline]
336    fn get_field(&self) {}
337}
338
339impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<()> for DateTime<A> {
340    #[inline]
341    fn get_field(&self) {}
342}
343
344impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<()> for ZonedDateTime<A, Z> {
345    #[inline]
346    fn get_field(&self) {}
347}
348
349impl GetField<()> for UtcOffset {
350    #[inline]
351    fn get_field(&self) {}
352}
353
354impl<O: TimeZoneModel> GetField<()> for TimeZoneInfo<O> {
355    #[inline]
356    fn get_field(&self) {}
357}