speedate 0.17.0

Fast and simple datetime, date, time and duration parsing
Documentation
use crate::date::MS_WATERSHED;
use crate::{ParseError, TimestampUnit};

pub(crate) fn timestamp_watershed(timestamp: i64) -> Result<(i64, u32), ParseError> {
    let ts_abs = timestamp.checked_abs().ok_or(ParseError::DateTooSmall)?;
    if ts_abs <= MS_WATERSHED {
        return Ok((timestamp, 0));
    }
    let mut seconds = timestamp / 1_000;
    let mut microseconds = ((timestamp % 1_000) * 1000) as i32;
    if microseconds < 0 {
        seconds -= 1;
        microseconds += 1_000_000;
    }
    Ok((seconds, microseconds as u32))
}

pub fn timestamp_to_seconds_micros(timestamp: i64, unit: TimestampUnit) -> Result<(i64, u32), ParseError> {
    match unit {
        TimestampUnit::Second => Ok((timestamp, 0)),
        TimestampUnit::Millisecond => {
            let mut seconds = timestamp / 1_000;
            let mut microseconds = ((timestamp % 1_000) * 1000) as i32;
            if microseconds < 0 {
                seconds -= 1;
                microseconds += 1_000_000;
            }
            Ok((seconds, microseconds as u32))
        }
        TimestampUnit::Infer => timestamp_watershed(timestamp),
    }
}