time_macros/format_description/public/
mod.rs1mod component;
2pub(super) mod modifier;
3
4use proc_macro::{Literal, 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 ::time::format_description::BorrowedFormatItem::Literal {
22 0: #(Literal::byte_string(bytes.as_ref()))
23 }
24 },
25 Self::Component(component) => quote_append! { ts
26 ::time::format_description::BorrowedFormatItem::Component { 0: #S(component) }
27 },
28 Self::Compound(items) => {
29 let items = items
30 .into_vec()
31 .into_iter()
32 .map(|item| quote! { #S(item), })
33 .collect::<TokenStream>();
34 quote_append! { ts
35 ::time::format_description::BorrowedFormatItem::Compound { 0: &[#S(items)] }
36 }
37 }
38 Self::Optional(item) => quote_append! {ts
39 ::time::format_description::BorrowedFormatItem::Optional { 0: &#S(*item) }
40 },
41 Self::First(items) => {
42 let items = items
43 .into_vec()
44 .into_iter()
45 .map(|item| quote! { #S(item), })
46 .collect::<TokenStream>();
47 quote_append! { ts
48 ::time::format_description::BorrowedFormatItem::First { 0: &[#S(items)] }
49 }
50 }
51 }
52 }
53}