use proc_macro::{Ident, Span, TokenStream};
use super::modifier;
use crate::to_tokens::ToTokenStream;
macro_rules! declare_component {
($($name:ident)*) => {
pub(crate) enum Component {$(
$name(modifier::$name),
)*}
impl ToTokenStream for Component {
fn append_to(self, ts: &mut TokenStream) {
let mut mts = TokenStream::new();
let component = match self {$(
Self::$name(modifier) => {
modifier.append_to(&mut mts);
stringify!($name)
}
)*};
let component = Ident::new(component, Span::mixed_site());
quote_append! { ts
::time::format_description::Component::#(component)(#S(mts))
}
}
}
};
}
declare_component! {
Day
Month
Ordinal
Weekday
WeekNumber
Year
Hour
Minute
Period
Second
Subsecond
OffsetHour
OffsetMinute
OffsetSecond
Ignore
UnixTimestamp
}