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 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}