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 }