From 4d75ddd58146e7ef20c6f3f9516b437cd186f6d4 Mon Sep 17 00:00:00 2001 From: Paul Dicker Date: Sun, 11 Jun 2023 08:52:31 +0200 Subject: [PATCH] Use `parse_rfc3339` directly in `DateTime::parse_from_rfc3339` --- src/datetime/mod.rs | 11 +++++++---- src/format/mod.rs | 3 ++- src/format/parse.rs | 10 ++-------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/datetime/mod.rs b/src/datetime/mod.rs index bf9c16ad5d..23586cd4d2 100644 --- a/src/datetime/mod.rs +++ b/src/datetime/mod.rs @@ -22,8 +22,9 @@ use std::time::{SystemTime, UNIX_EPOCH}; use crate::format::DelayedFormat; #[cfg(feature = "unstable-locales")] use crate::format::Locale; -use crate::format::{parse, parse_and_remainder, ParseError, ParseResult, Parsed, StrftimeItems}; -use crate::format::{Fixed, Item}; +use crate::format::{parse, parse_and_remainder, parse_rfc3339}; +use crate::format::{Fixed, Item, TOO_LONG}; +use crate::format::{ParseError, ParseResult, Parsed, StrftimeItems}; use crate::naive::{Days, IsoWeek, NaiveDate, NaiveDateTime, NaiveTime}; #[cfg(feature = "clock")] use crate::offset::Local; @@ -631,9 +632,11 @@ impl DateTime { /// also simultaneously valid RFC 3339 values, but not all RFC 3339 values are valid ISO 8601 /// values (or the other way around). pub fn parse_from_rfc3339(s: &str) -> ParseResult> { - const ITEMS: &[Item<'static>] = &[Item::Fixed(Fixed::RFC3339)]; let mut parsed = Parsed::new(); - parse(&mut parsed, s, ITEMS.iter())?; + let (s, _) = parse_rfc3339(&mut parsed, s)?; + if !s.is_empty() { + return Err(TOO_LONG); + } parsed.to_datetime() } diff --git a/src/format/mod.rs b/src/format/mod.rs index 7c9c3b7dd0..d077256641 100644 --- a/src/format/mod.rs +++ b/src/format/mod.rs @@ -56,6 +56,7 @@ use crate::{Month, ParseMonthError, ParseWeekdayError, Weekday}; #[cfg(feature = "unstable-locales")] pub(crate) mod locales; +pub(crate) use parse::parse_rfc3339; pub use parse::{parse, parse_and_remainder}; pub use parsed::Parsed; /// L10n locales. @@ -425,7 +426,7 @@ const IMPOSSIBLE: ParseError = ParseError(ParseErrorKind::Impossible); const NOT_ENOUGH: ParseError = ParseError(ParseErrorKind::NotEnough); const INVALID: ParseError = ParseError(ParseErrorKind::Invalid); const TOO_SHORT: ParseError = ParseError(ParseErrorKind::TooShort); -const TOO_LONG: ParseError = ParseError(ParseErrorKind::TooLong); +pub(crate) const TOO_LONG: ParseError = ParseError(ParseErrorKind::TooLong); const BAD_FORMAT: ParseError = ParseError(ParseErrorKind::BadFormat); #[cfg(any(feature = "alloc", feature = "std", test))] diff --git a/src/format/parse.rs b/src/format/parse.rs index ae31d6a1df..d5fa162450 100644 --- a/src/format/parse.rs +++ b/src/format/parse.rs @@ -157,7 +157,7 @@ fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a st Ok((s, ())) } -fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> { +pub(crate) fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> { macro_rules! try_consume { ($e:expr) => {{ let (s_, v) = $e?; @@ -1491,19 +1491,13 @@ fn test_rfc3339() { ("2015-01-20T00:00:1-08:00", Err(INVALID)), // missing complete S ]; - fn rfc3339_to_datetime(date: &str) -> ParseResult> { - let mut parsed = Parsed::new(); - parse(&mut parsed, date, [Item::Fixed(Fixed::RFC3339)].iter())?; - parsed.to_datetime() - } - fn fmt_rfc3339_datetime(dt: DateTime) -> String { dt.format_with_items([Item::Fixed(Fixed::RFC3339)].iter()).to_string() } // Test against test data above for &(date, checkdate) in testdates.iter() { - let d = rfc3339_to_datetime(date); // parse a date + let d = DateTime::::parse_from_rfc3339(date); let dt = match d { // did we get a value? Ok(dt) => Ok(fmt_rfc3339_datetime(dt)), // yes, go on