1use 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
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 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}