-
-
Notifications
You must be signed in to change notification settings - Fork 283
/
Copy pathdatetime.rs
54 lines (46 loc) · 1.46 KB
/
datetime.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use std::iter::Peekable;
use proc_macro::{token_stream, TokenStream};
use crate::date::Date;
use crate::error::Error;
use crate::offset::Offset;
use crate::time::Time;
use crate::to_tokens::ToTokens;
use crate::{date, offset, time};
pub(crate) struct DateTime {
date: Date,
time: Time,
offset: Option<Offset>,
}
pub(crate) fn parse(chars: &mut Peekable<token_stream::IntoIter>) -> Result<DateTime, Error> {
let date = date::parse(chars)?;
let time = time::parse(chars)?;
#[allow(clippy::unnested_or_patterns)]
let offset = match offset::parse(chars) {
Ok(offset) => Some(offset),
Err(Error::UnexpectedEndOfInput) | Err(Error::MissingComponent { name: "sign", .. }) => {
None
}
Err(err) => return Err(err),
};
if let Some(token) = chars.peek() {
return Err(Error::UnexpectedToken {
tree: token.clone(),
});
}
Ok(DateTime { date, time, offset })
}
impl ToTokens for DateTime {
fn into_token_stream(self) -> TokenStream {
let (type_name, maybe_offset) = match self.offset {
Some(offset) => (quote!(OffsetDateTime), quote!(.assume_offset(#(offset)))),
None => (quote!(PrimitiveDateTime), quote!()),
};
quote! {{
const DATE_TIME: ::time::#(type_name) = ::time::PrimitiveDateTime::new(
#(self.date),
#(self.time),
) #(maybe_offset);
DATE_TIME
}}
}
}