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) => quote_append! { ts
21                BorrowedFormatItem::Literal(#(Literal::byte_string(bytes.as_ref())))
22            },
23            Self::Component(component) => 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| quote_! { #S(item), })
31                    .collect::<TokenStream>();
32                quote_append! { ts
33                    BorrowedFormatItem::Compound { 0: &[#S(items)] }
34                }
35            }
36            Self::Optional(item) => 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| quote_! { #S(item), })
44                    .collect::<TokenStream>();
45                quote_append! { ts
46                    BorrowedFormatItem::First { 0: &[#S(items)] }
47                }
48            }
49        }
50    }
51}