mirror of
				https://github.com/bspeice/dtparse
				synced 2025-11-04 10:30:34 -05:00 
			
		
		
		
	Merge branch 'master' into fuzzy_dates
This commit is contained in:
		@ -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"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/lib.rs
									
									
									
									
									
								
							@ -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))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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")));
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user