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) => {
use proc_macro::*;
ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
Span::mixed_site()))]);
ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
TokenTree::from(Punct::new(':', Spacing::Alone))]);
;
ts.extend([TokenTree::from(Ident::new(&"Literal", Span::mixed_site()))]);
ts.extend([TokenTree::Group(Group::new(Delimiter::Parenthesis,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
ts_mut.extend([crate::to_tokens::ToTokenTree::into_token_tree(Literal::byte_string(bytes.as_ref()))]);
;
ts
}))]);
;
}quote_append! { ts
21 BorrowedFormatItem::Literal(#(Literal::byte_string(bytes.as_ref())))
22 },
23 Self::Component(component) => {
use proc_macro::*;
ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
Span::mixed_site()))]);
ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
TokenTree::from(Punct::new(':', Spacing::Alone))]);
;
ts.extend([TokenTree::from(Ident::new(&"Component",
Span::mixed_site()))]);
ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
ts_mut.extend([TokenTree::from(Punct::new(':',
Spacing::Alone))]);
;
crate::to_tokens::ToTokenStream::append_to(component,
ts_mut);
;
ts
}))]);
;
}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| {
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
crate::to_tokens::ToTokenStream::append_to(item, ts_mut);
ts_mut.extend([TokenTree::from(Punct::new(',', Spacing::Alone))]);
;
;
ts
}quote_! { #S(item), })
31 .collect::<TokenStream>();
32 {
use proc_macro::*;
ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
Span::mixed_site()))]);
ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
TokenTree::from(Punct::new(':', Spacing::Alone))]);
;
ts.extend([TokenTree::from(Ident::new(&"Compound", Span::mixed_site()))]);
ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
ts_mut.extend([TokenTree::from(Punct::new(':',
Spacing::Alone))]);
;
ts_mut.extend([TokenTree::from(Punct::new('&',
Spacing::Alone))]);
;
ts_mut.extend([TokenTree::Group(Group::new(Delimiter::Bracket,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
crate::to_tokens::ToTokenStream::append_to(items, ts_mut);
;
ts
}))]);
;
ts
}))]);
;
}quote_append! { ts
33 BorrowedFormatItem::Compound { 0: &[#S(items)] }
34 }
35 }
36 Self::Optional(item) => {
use proc_macro::*;
ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
Span::mixed_site()))]);
ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
TokenTree::from(Punct::new(':', Spacing::Alone))]);
;
ts.extend([TokenTree::from(Ident::new(&"Optional", Span::mixed_site()))]);
ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
ts_mut.extend([TokenTree::from(Punct::new(':',
Spacing::Alone))]);
;
ts_mut.extend([TokenTree::from(Punct::new('&',
Spacing::Alone))]);
;
crate::to_tokens::ToTokenStream::append_to(*item, ts_mut);
;
ts
}))]);
;
}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| {
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
crate::to_tokens::ToTokenStream::append_to(item, ts_mut);
ts_mut.extend([TokenTree::from(Punct::new(',', Spacing::Alone))]);
;
;
ts
}quote_! { #S(item), })
44 .collect::<TokenStream>();
45 {
use proc_macro::*;
ts.extend([TokenTree::from(Ident::new(&"BorrowedFormatItem",
Span::mixed_site()))]);
ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
TokenTree::from(Punct::new(':', Spacing::Alone))]);
;
ts.extend([TokenTree::from(Ident::new(&"First", Span::mixed_site()))]);
ts.extend([TokenTree::Group(Group::new(Delimiter::Brace,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
ts_mut.extend([TokenTree::from(Literal::usize_unsuffixed(0))]);
ts_mut.extend([TokenTree::from(Punct::new(':',
Spacing::Alone))]);
;
ts_mut.extend([TokenTree::from(Punct::new('&',
Spacing::Alone))]);
;
ts_mut.extend([TokenTree::Group(Group::new(Delimiter::Bracket,
{
use proc_macro::*;
let mut ts = TokenStream::new();
let ts_mut = &mut ts;
crate::to_tokens::ToTokenStream::append_to(items, ts_mut);
;
ts
}))]);
;
ts
}))]);
;
}quote_append! { ts
46 BorrowedFormatItem::First { 0: &[#S(items)] }
47 }
48 }
49 }
50 }
51}