1use 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
16pub trait GetField<T>: UnstableSealed {
25 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}