time_macros/format_description/public/
mod.rs

1mod component;
2pub(super) mod modifier;
3
4use proc_macro::TokenStream;
5
6pub(crate) use self::component::Component;
7use crate::to_tokens::ToTokenStream;
8
9pub(crate) enum OwnedFormatItem {
10    Literal(Box<[u8]>),
11    Component(Component),
12    Compound(Box<[Self]>),
13    Optional(Box<Self>),
14    First(Box<[Self]>),
15}
16
17impl ToTokenStream for OwnedFormatItem {
18    fn append_to(self, ts: &mut TokenStream) {
19        match self {
20            Self::Literal(bytes) => {
    use proc_macro::*;
    ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"Literal", Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Parenthesis,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            ts_mut.extend([crate::to_tokens::ToTokenTree::into_token_tree(Literal::byte_string(bytes.as_ref()))]);
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
21                BorrowedFormatItem::Literal(#(Literal::byte_string(bytes.as_ref())))
22            },
23            Self::Component(component) => {
    use proc_macro::*;
    ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"Component",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
                            ts_mut.extend([TokenTree::from(Punct::new(':',
                                                Spacing::Alone))]);
                            ;
                            crate::to_tokens::ToTokenStream::append_to(component,
                                ts_mut);
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
24                BorrowedFormatItem::Component { 0: #S(component) }
25            },
26            Self::Compound(items) => {
27                let items = items
28                    .into_vec()
29                    .into_iter()
30                    .map(|item| {
    use proc_macro::*;
    let mut ts = TokenStream::new();
    let ts_mut = &mut ts;
    crate::to_tokens::ToTokenStream::append_to(item, ts_mut);
    ts_mut.extend([TokenTree::from(Punct::new(',', Spacing::Alone))]);
    ;
    ;
    ts
}quote_! { #S(item), })
31                    .collect::<TokenStream>();
32                {
    use proc_macro::*;
    ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"Compound", Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
                            ts_mut.extend([TokenTree::from(Punct::new(':',
                                                Spacing::Alone))]);
                            ;
                            ts_mut.extend([TokenTree::from(Punct::new('&',
                                                Spacing::Alone))]);
                            ;
                            ts_mut.extend([TokenTree::Group(Group::new(Delimiter::Bracket,
                                                {
                                                    use proc_macro::*;
                                                    let mut ts = TokenStream::new();
                                                    let ts_mut = &mut ts;
                                                    crate::to_tokens::ToTokenStream::append_to(items, ts_mut);
                                                    ;
                                                    ts
                                                }))]);
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
33                    BorrowedFormatItem::Compound { 0: &[#S(items)] }
34                }
35            }
36            Self::Optional(item) => {
    use proc_macro::*;
    ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"Optional", Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
                            ts_mut.extend([TokenTree::from(Punct::new(':',
                                                Spacing::Alone))]);
                            ;
                            ts_mut.extend([TokenTree::from(Punct::new('&',
                                                Spacing::Alone))]);
                            ;
                            crate::to_tokens::ToTokenStream::append_to(*item, ts_mut);
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
37                BorrowedFormatItem::Optional { 0: &#S(*item) }
38            },
39            Self::First(items) => {
40                let items = items
41                    .into_vec()
42                    .into_iter()
43                    .map(|item| {
    use proc_macro::*;
    let mut ts = TokenStream::new();
    let ts_mut = &mut ts;
    crate::to_tokens::ToTokenStream::append_to(item, ts_mut);
    ts_mut.extend([TokenTree::from(Punct::new(',', Spacing::Alone))]);
    ;
    ;
    ts
}quote_! { #S(item), })
44                    .collect::<TokenStream>();
45                {
    use proc_macro::*;
    ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"First", Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
                            ts_mut.extend([TokenTree::from(Punct::new(':',
                                                Spacing::Alone))]);
                            ;
                            ts_mut.extend([TokenTree::from(Punct::new('&',
                                                Spacing::Alone))]);
                            ;
                            ts_mut.extend([TokenTree::Group(Group::new(Delimiter::Bracket,
                                                {
                                                    use proc_macro::*;
                                                    let mut ts = TokenStream::new();
                                                    let ts_mut = &mut ts;
                                                    crate::to_tokens::ToTokenStream::append_to(items, ts_mut);
                                                    ;
                                                    ts
                                                }))]);
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
46                    BorrowedFormatItem::First { 0: &[#S(items)] }
47                }
48            }
49        }
50    }
51}