Merge branch 'master' into fuzzy_dates

pull/12/head
Bradlee Speice 2018-07-08 22:01:14 -04:00
commit 41d7194898
3 changed files with 24 additions and 12 deletions

View File

@ -18,4 +18,4 @@ name = "dtparse"
chrono = "0.4"
lazy_static = "1.0"
num-traits = "0.2"
rust_decimal = "0.8"
rust_decimal = "0.9"

View File

@ -68,13 +68,12 @@ impl From<ParseIntError> for ParseInternalError {
pub enum ParseError {
AmbiguousWeekday,
InternalError(ParseInternalError),
InvalidDay,
InvalidMonth,
UnrecognizedToken(String),
InvalidParseResult(ParsingResult),
AmPmWithoutHour,
InvalidHour,
TimezoneUnsupported,
ImpossibleTimestamp(&'static str),
}
impl From<ParseInternalError> for ParseError {
@ -766,7 +765,7 @@ impl Parser {
if fuzzy {
val_is_ampm = false;
} else {
return Err(ParseError::InvalidHour);
return Err(ParseError::ImpossibleTimestamp("Invalid hour"));
}
}
@ -798,13 +797,24 @@ impl Parser {
let d = d + d_offset;
let t = NaiveTime::from_hms_micro(
res.hour.unwrap_or(default.hour() as i32) as u32,
res.minute.unwrap_or(default.minute() as i32) as u32,
res.second.unwrap_or(default.second() as i32) as u32,
res.microsecond
.unwrap_or(default.timestamp_subsec_micros() as i32) as u32,
);
let hour = res.hour.unwrap_or(default.hour() as i32) as u32;
let minute = res.minute.unwrap_or(default.minute() as i32) as u32;
let second = res.second.unwrap_or(default.second() as i32) as u32;
let microsecond = res.microsecond
.unwrap_or(default.timestamp_subsec_micros() as i32) as u32;
let t = NaiveTime::from_hms_micro_opt(hour, minute, second, microsecond).ok_or_else(|| {
if hour >= 24 {
ParseError::ImpossibleTimestamp("Invalid hour")
} else if minute >= 60 {
ParseError::ImpossibleTimestamp("Invalid minute")
} else if second >= 60 {
ParseError::ImpossibleTimestamp("Invalid second")
} else if microsecond >= 2_000_000 {
ParseError::ImpossibleTimestamp("Invalid microsecond")
} else {
unreachable!();
}
})?;
Ok(NaiveDateTime::new(d, t))
}

View File

@ -14,4 +14,6 @@ fn test_fuzz() {
let mut p = Parser::default();
let res = p.parse("\x0D\x31", None, None, false, false, Some(&default), false, HashMap::new()).unwrap();
assert_eq!(res.0, default);
}
assert_eq!(parse("\x2D\x2D\x32\x31\x38\x6D"), Err(ParseError::ImpossibleTimestamp("Invalid minute")));
}