crdb_core/
timestamp.rs

1use web_time::SystemTime;
2
3pub trait SystemTimeExt {
4    fn ms_since_posix(&self) -> crate::Result<i64>;
5
6    fn from_ms_since_posix(ms: i64) -> crate::Result<SystemTime>;
7}
8
9impl SystemTimeExt for SystemTime {
10    fn ms_since_posix(&self) -> crate::Result<i64> {
11        self.duration_since(SystemTime::UNIX_EPOCH)
12            .map_err(|_| crate::Error::InvalidTime(*self))?
13            .as_millis()
14            .try_into()
15            .map_err(|_| crate::Error::InvalidTime(*self))
16    }
17
18    fn from_ms_since_posix(ms: i64) -> crate::Result<SystemTime> {
19        use std::time::Duration;
20        let ms = u64::try_from(ms).map_err(|_| {
21            crate::Error::Other(anyhow::anyhow!(
22                "Cannot convert negative milliseconds into SystemTime"
23            ))
24        })?;
25        Ok(SystemTime::UNIX_EPOCH + Duration::from_millis(ms))
26    }
27}