Showing the changes to git-date/src (1 of 2 files). Show all
Unified · Split
| @@ -1,6 +1,8 @@ | ||
| 1 | 1 | #[derive(thiserror::Error, Debug)] |
| 2 | 2 | #[allow(missing_docs)] |
| 3 | 3 | pub enum Error { |
| 4 | + #[error("Cannot represent times before UNIX epoch at timestamp {timestamp}")] | |
| 5 | + TooEarly { timestamp: i64 }, | |
| 4 | 6 | #[error("Date string can not be parsed")] |
| 5 | 7 | InvalidDateString, |
| 6 | 8 | #[error("Dates past 2038 can not be represented.")] |
| @@ -44,12 +46,21 @@ pub(crate) mod function { · 37 unmodified lines | ||
| 44 | 46 | // Format::Raw |
| 45 | 47 | val |
| 46 | 48 | } else if let Some(time) = relative::parse(input, now).transpose()? { |
| 47 | − Time::new(time.unix_timestamp().try_into()?, time.offset().whole_seconds()) | |
| 49 | + Time::new(timestamp(time)?, time.offset().whole_seconds()) | |
| 48 | 50 | } else { |
| 49 | 51 | return Err(Error::InvalidDateString); |
| 50 | 52 | }) |
| 51 | 53 | } |
| 52 | 54 | |
| 55 | + fn timestamp(date: OffsetDateTime) -> Result<u32, Error> { | |
| 56 | + let timestamp = date.unix_timestamp(); | |
| 57 | + if timestamp < 0 { | |
| 58 | + Err(Error::TooEarly { timestamp }) | |
| 59 | + } else { | |
| 60 | + Ok(timestamp.try_into()?) | |
| 61 | + } | |
| 62 | + } | |
| 63 | + | |
| 53 | 64 | fn parse_raw(input: &str) -> Option<Time> { |
| 54 | 65 | let mut split = input.split_whitespace(); |
| 55 | 66 | let seconds_since_unix_epoch: u32 = split.next()?.parse().ok()?; |