time_macros/format_description/public/component.rs
1use proc_macro::{Ident, Span, TokenStream};
2
3use super::modifier;
4use crate::to_tokens::ToTokenStream;
5
6macro_rules! declare_component {
7 ($($(#[cfg($cfg_inner:meta)])* $name:ident)*) => {
8 pub(crate) enum Component {$(
9 $(#[cfg($cfg_inner)])*
10 $name(modifier::$name),
11 )*}
12
13 impl ToTokenStream for Component {
14 fn append_to(self, ts: &mut TokenStream) {
15 let mut mts = TokenStream::new();
16
17 let component = match self {$(
18 $(#[cfg($cfg_inner)])*
19 Self::$name(modifier) => {
20 modifier.append_to(&mut mts);
21 stringify!($name)
22 }
23 )*};
24 let component = Ident::new(component, Span::mixed_site());
25
26 quote_append! { ts
27 Component::#(component)(#S(mts))
28 }
29 }
30 }
31 };
32}
33
34declare_component! {
35 Day
36 MonthShort
37 MonthLong
38 MonthNumerical
39 Ordinal
40 WeekdayShort
41 WeekdayLong
42 WeekdaySunday
43 WeekdayMonday
44 WeekNumberIso
45 WeekNumberSunday
46 WeekNumberMonday
47 CalendarYearFullExtendedRange
48 CalendarYearFullStandardRange
49 IsoYearFullExtendedRange
50 IsoYearFullStandardRange
51 CalendarYearCenturyExtendedRange
52 CalendarYearCenturyStandardRange
53 IsoYearCenturyExtendedRange
54 IsoYearCenturyStandardRange
55 CalendarYearLastTwo
56 IsoYearLastTwo
57 Hour12
58 Hour24
59 Minute
60 Period
61 Second
62 Subsecond
63 OffsetHour
64 OffsetMinute
65 OffsetSecond
66 Ignore
67 UnixTimestampSecond
68 UnixTimestampMillisecond
69 UnixTimestampMicrosecond
70 UnixTimestampNanosecond
71 End
72}