Skip to main content

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    StringLiteral(Box<str>),
12    Component(Component),
13    Compound(Box<[Self]>),
14    Optional(Box<Self>),
15    First(Box<[Self]>),
16}
17
18impl ToTokenStream for OwnedFormatItem {
19    fn append_to(self, ts: &mut TokenStream) {
20        match self {
21            Self::Literal(bytes) => quote_append! { ts
22                BorrowedFormatItem::Literal(#(Literal::byte_string(bytes.as_ref())))
23            },
24            Self::StringLiteral(string) => quote_append! { ts
25                BorrowedFormatItem::StringLiteral(#(string.as_ref()))
26            },
27            Self::Component(component) => quote_append! { ts
28                BorrowedFormatItem::Component { 0: #S(component) }
29            },
30            Self::Compound(items) => {
31                let items = items
32                    .into_vec()
33                    .into_iter()
34                    .map(|item| quote_! { #S(item), })
35                    .collect::<TokenStream>();
36                quote_append! { ts
37                    BorrowedFormatItem::Compound { 0: &[#S(items)] }
38                }
39            }
40            Self::Optional(item) => quote_append! { ts
41                BorrowedFormatItem::Optional { 0: &#S(*item) }
42            },
43            Self::First(items) => {
44                let items = items
45                    .into_vec()
46                    .into_iter()
47                    .map(|item| quote_! { #S(item), })
48                    .collect::<TokenStream>();
49                quote_append! { ts
50                    BorrowedFormatItem::First { 0: &[#S(items)] }
51                }
52            }
53        }
54    }
55}