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