use std::ops::RangeInclusive; use crate::parser::errors::CustomError; use crate::parser::prelude::*; use crate::parser::trivia::from_utf8_unchecked; use toml_datetime::*; use winnow::combinator::alt; use winnow::combinator::cut_err; use winnow::combinator::opt; use winnow::combinator::preceded; use winnow::token::one_of; use winnow::token::take_while; use winnow::trace::trace; // ;; Date and Time (as defined in RFC 3339) // date-time = offset-date-time / local-date-time / local-date / local-time // offset-date-time = full-date time-delim full-time // local-date-time = full-date time-delim partial-time // local-date = full-date // local-time = partial-time // full-time = partial-time time-offset pub(crate) fn date_time(input: &mut Input<'_>) -> PResult { trace( "date-time", alt(( (full_date, opt((time_delim, partial_time, opt(time_offset)))) .map(|(date, opt)| { match opt { // Offset Date-Time Some((_, time, offset)) => Datetime { date: Some(date), time: Some(time), offset, }, // Local Date None => Datetime { date: Some(date), time: None, offset: None, }, } }) .context(StrContext::Label("date-time")), partial_time .map(|t| t.into()) .context(StrContext::Label("time")), )), ) .parse_next(input) } // full-date = date-fullyear "-" date-month "-" date-mday pub(crate) fn full_date(input: &mut Input<'_>) -> PResult { trace( "full-date", (date_fullyear, b'-', cut_err((date_month, b'-', date_mday))) .map(|(year, _, (month, _, day))| Date { year, month, day }), ) .parse_next(input) } // partial-time = time-hour ":" time-minute ":" time-second [time-secfrac] pub(crate) fn partial_time(input: &mut Input<'_>) -> PResult