time_macros/
utc_datetime.rs

1use std::iter::Peekable;
2
3use proc_macro::{token_stream, TokenStream};
4
5use crate::date::Date;
6use crate::error::Error;
7use crate::time::Time;
8use crate::to_tokens::ToTokenStream;
9use crate::{date, time};
10
11pub(crate) struct UtcDateTime {
12    date: Date,
13    time: Time,
14}
15
16pub(crate) fn parse(chars: &mut Peekable<token_stream::IntoIter>) -> Result<UtcDateTime, Error> {
17    let date = date::parse(chars)?;
18    let time = time::parse(chars)?;
19
20    if let Some(token) = chars.peek() {
21        return Err(Error::UnexpectedToken {
22            tree: token.clone(),
23        });
24    }
25
26    Ok(UtcDateTime { date, time })
27}
28
29impl ToTokenStream for UtcDateTime {
30    fn append_to(self, ts: &mut TokenStream) {
31        {
    use proc_macro::*;
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"time", Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"UtcDateTime",
                        Span::mixed_site()))]);
    ts.extend([TokenTree::from(Punct::new(':', Spacing::Joint)),
                TokenTree::from(Punct::new(':', Spacing::Alone))]);
    ;
    ts.extend([TokenTree::from(Ident::new(&"new", Span::mixed_site()))]);
    ts.extend([TokenTree::Group(Group::new(Delimiter::Parenthesis,
                        {
                            use proc_macro::*;
                            let mut ts = TokenStream::new();
                            let ts_mut = &mut ts;
                            crate::to_tokens::ToTokenStream::append_to(self.date,
                                ts_mut);
                            ts_mut.extend([TokenTree::from(Punct::new(',',
                                                Spacing::Alone))]);
                            ;
                            crate::to_tokens::ToTokenStream::append_to(self.time,
                                ts_mut);
                            ts_mut.extend([TokenTree::from(Punct::new(',',
                                                Spacing::Alone))]);
                            ;
                            ;
                            ts
                        }))]);
    ;
}quote_append! { ts
32            ::time::UtcDateTime::new(
33                #S(self.date),
34                #S(self.time),
35            )
36        }
37    }
38}