Skip to main content

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}