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, RataDie, Weekday, YearInfo},
7    AsCalendar, Calendar, Date,
8};
9use icu_time::{
10    zone::{models::TimeZoneModel, 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<C: Calendar, A: AsCalendar<Calendar = C>> GetField<RataDie> for Date<A> {
77    #[inline]
78    fn get_field(&self) -> RataDie {
79        self.to_rata_die()
80    }
81}
82
83impl UnstableSealed for Time {}
84
85impl GetField<Hour> for Time {
86    #[inline]
87    fn get_field(&self) -> Hour {
88        self.hour
89    }
90}
91
92impl GetField<Minute> for Time {
93    #[inline]
94    fn get_field(&self) -> Minute {
95        self.minute
96    }
97}
98
99impl GetField<Second> for Time {
100    #[inline]
101    fn get_field(&self) -> Second {
102        self.second
103    }
104}
105
106impl GetField<Nanosecond> for Time {
107    #[inline]
108    fn get_field(&self) -> Nanosecond {
109        self.subsecond
110    }
111}
112
113impl<C: Calendar, A: AsCalendar<Calendar = C>> UnstableSealed for DateTime<A> {}
114
115impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<YearInfo> for DateTime<A> {
116    #[inline]
117    fn get_field(&self) -> YearInfo {
118        self.date.year()
119    }
120}
121
122impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<MonthInfo> for DateTime<A> {
123    #[inline]
124    fn get_field(&self) -> MonthInfo {
125        self.date.month()
126    }
127}
128
129impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfMonth> for DateTime<A> {
130    #[inline]
131    fn get_field(&self) -> DayOfMonth {
132        self.date.day_of_month()
133    }
134}
135
136impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Weekday> for DateTime<A> {
137    #[inline]
138    fn get_field(&self) -> Weekday {
139        self.date.day_of_week()
140    }
141}
142
143impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<DayOfYear> for DateTime<A> {
144    #[inline]
145    fn get_field(&self) -> DayOfYear {
146        self.date.day_of_year()
147    }
148}
149
150impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<RataDie> for DateTime<A> {
151    #[inline]
152    fn get_field(&self) -> RataDie {
153        self.date.to_rata_die()
154    }
155}
156
157impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Hour> for DateTime<A> {
158    #[inline]
159    fn get_field(&self) -> Hour {
160        self.time.hour
161    }
162}
163
164impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Minute> for DateTime<A> {
165    #[inline]
166    fn get_field(&self) -> Minute {
167        self.time.minute
168    }
169}
170
171impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Second> for DateTime<A> {
172    #[inline]
173    fn get_field(&self) -> Second {
174        self.time.second
175    }
176}
177
178impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<Nanosecond> for DateTime<A> {
179    #[inline]
180    fn get_field(&self) -> Nanosecond {
181        self.time.subsecond
182    }
183}
184
185impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> UnstableSealed for ZonedDateTime<A, Z> {}
186
187impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<YearInfo> for ZonedDateTime<A, Z> {
188    #[inline]
189    fn get_field(&self) -> YearInfo {
190        self.date.year()
191    }
192}
193
194impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<MonthInfo> for ZonedDateTime<A, Z> {
195    #[inline]
196    fn get_field(&self) -> MonthInfo {
197        self.date.month()
198    }
199}
200
201impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<DayOfMonth> for ZonedDateTime<A, Z> {
202    #[inline]
203    fn get_field(&self) -> DayOfMonth {
204        self.date.day_of_month()
205    }
206}
207
208impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Weekday> for ZonedDateTime<A, Z> {
209    #[inline]
210    fn get_field(&self) -> Weekday {
211        self.date.day_of_week()
212    }
213}
214
215impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<DayOfYear> for ZonedDateTime<A, Z> {
216    #[inline]
217    fn get_field(&self) -> DayOfYear {
218        self.date.day_of_year()
219    }
220}
221
222impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<RataDie> for ZonedDateTime<A, Z> {
223    #[inline]
224    fn get_field(&self) -> RataDie {
225        self.date.to_rata_die()
226    }
227}
228
229impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Hour> for ZonedDateTime<A, Z> {
230    #[inline]
231    fn get_field(&self) -> Hour {
232        self.time.hour
233    }
234}
235
236impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Minute> for ZonedDateTime<A, Z> {
237    #[inline]
238    fn get_field(&self) -> Minute {
239        self.time.minute
240    }
241}
242
243impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Second> for ZonedDateTime<A, Z> {
244    #[inline]
245    fn get_field(&self) -> Second {
246        self.time.second
247    }
248}
249
250impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Nanosecond> for ZonedDateTime<A, Z> {
251    #[inline]
252    fn get_field(&self) -> Nanosecond {
253        self.time.subsecond
254    }
255}
256
257impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<Option<UtcOffset>>
258    for ZonedDateTime<A, Z>
259where
260    Z: GetField<Option<UtcOffset>>,
261{
262    #[inline]
263    fn get_field(&self) -> Option<UtcOffset> {
264        self.zone.get_field()
265    }
266}
267
268impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<TimeZone> for ZonedDateTime<A, Z>
269where
270    Z: GetField<TimeZone>,
271{
272    #[inline]
273    fn get_field(&self) -> TimeZone {
274        self.zone.get_field()
275    }
276}
277
278impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<ZoneNameTimestamp>
279    for ZonedDateTime<A, Z>
280where
281    Z: GetField<ZoneNameTimestamp>,
282{
283    #[inline]
284    fn get_field(&self) -> ZoneNameTimestamp {
285        self.zone.get_field()
286    }
287}
288
289impl UnstableSealed for UtcOffset {}
290
291impl GetField<Option<UtcOffset>> for UtcOffset {
292    #[inline]
293    fn get_field(&self) -> Option<UtcOffset> {
294        Some(*self)
295    }
296}
297
298impl<O: TimeZoneModel> UnstableSealed for TimeZoneInfo<O> {}
299
300impl<O> GetField<TimeZone> for TimeZoneInfo<O>
301where
302    O: TimeZoneModel,
303{
304    #[inline]
305    fn get_field(&self) -> TimeZone {
306        self.id()
307    }
308}
309
310impl<O> GetField<Option<UtcOffset>> for TimeZoneInfo<O>
311where
312    O: TimeZoneModel,
313{
314    #[inline]
315    fn get_field(&self) -> Option<UtcOffset> {
316        self.offset()
317    }
318}
319
320impl<O> GetField<ZoneNameTimestamp> for TimeZoneInfo<O>
321where
322    O: TimeZoneModel<ZoneNameTimestamp = ZoneNameTimestamp>,
323{
324    #[inline]
325    fn get_field(&self) -> ZoneNameTimestamp {
326        self.zone_name_timestamp()
327    }
328}
329
330impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<()> for Date<A> {
331    #[inline]
332    fn get_field(&self) {}
333}
334
335impl GetField<()> for Time {
336    #[inline]
337    fn get_field(&self) {}
338}
339
340impl<C: Calendar, A: AsCalendar<Calendar = C>> GetField<()> for DateTime<A> {
341    #[inline]
342    fn get_field(&self) {}
343}
344
345impl<C: Calendar, A: AsCalendar<Calendar = C>, Z> GetField<()> for ZonedDateTime<A, Z> {
346    #[inline]
347    fn get_field(&self) {}
348}
349
350impl GetField<()> for UtcOffset {
351    #[inline]
352    fn get_field(&self) {}
353}
354
355impl<O: TimeZoneModel> GetField<()> for TimeZoneInfo<O> {
356    #[inline]
357    fn get_field(&self) {}
358}