time_macros/format_description/public/
mod.rs1mod 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}