time_macros/format_description/public/
mod.rs

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