diff options
Diffstat (limited to 'vendor/rustversion/src/date.rs')
-rw-r--r-- | vendor/rustversion/src/date.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/vendor/rustversion/src/date.rs b/vendor/rustversion/src/date.rs new file mode 100644 index 000000000..5cdb691da --- /dev/null +++ b/vendor/rustversion/src/date.rs @@ -0,0 +1,50 @@ +use crate::error::{Error, Result}; +use crate::iter::Iter; +use crate::{time, token}; +use proc_macro::Group; +use std::fmt::{self, Display}; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Date { + pub year: u16, + pub month: u8, + pub day: u8, +} + +impl Display for Date { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!( + formatter, + "{:04}-{:02}-{:02}", + self.year, self.month, self.day, + ) + } +} + +pub fn parse(paren: Group, iter: Iter) -> Result<Date> { + try_parse(iter).map_err(|_| { + let msg = format!("expected nightly date, like {}", time::today()); + Error::group(paren, msg) + }) +} + +fn try_parse(iter: Iter) -> Result<Date, ()> { + let year = token::parse_literal(iter).map_err(drop)?; + token::parse_punct(iter, '-').map_err(drop)?; + let month = token::parse_literal(iter).map_err(drop)?; + token::parse_punct(iter, '-').map_err(drop)?; + let day = token::parse_literal(iter).map_err(drop)?; + + let year = year.to_string().parse::<u64>().map_err(drop)?; + let month = month.to_string().parse::<u64>().map_err(drop)?; + let day = day.to_string().parse::<u64>().map_err(drop)?; + if year >= 3000 || month > 12 || day > 31 { + return Err(()); + } + + Ok(Date { + year: year as u16, + month: month as u8, + day: day as u8, + }) +} |