mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-19 17:46:17 +00:00
76aae3cb96
`parse_duration` is no longer maintained upstream; `fundu-system` seems like the best option to provide most of the functionality provided by parse_duration and minimize deps. Fixes #1246 Dep diffstat: +3 -6 ## Caveats - I've done basically no testing of this PR beyond `cargo test` - See my comment in #1246 for regression risk; this is a breaking change. Is there a document I should update to make note of this? Should I rebase this for `next-v3` instead? - In theory CVE-2021-29932 is fixed by this PR as `fundu-systemd` doesn't support exponents, but I've done no verification that this is really the case beyond the info in #1246 Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/1468 Reviewed-by: Alex <lx@deuxfleurs.fr>
44 lines
1.4 KiB
Rust
44 lines
1.4 KiB
Rust
//! Module containing helper functions to manipulate time
|
|
use chrono::{SecondsFormat, TimeZone, Utc};
|
|
use std::convert::TryInto;
|
|
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
|
|
|
use crate::error::Error;
|
|
|
|
/// Returns milliseconds since UNIX Epoch
|
|
pub fn now_msec() -> u64 {
|
|
SystemTime::now()
|
|
.duration_since(UNIX_EPOCH)
|
|
.expect("Fix your clock :o")
|
|
.as_millis() as u64
|
|
}
|
|
|
|
/// Increment logical clock
|
|
pub fn increment_logical_clock(prev: u64) -> u64 {
|
|
std::cmp::max(prev + 1, now_msec())
|
|
}
|
|
|
|
/// Increment two logical clocks
|
|
pub fn increment_logical_clock_2(prev: u64, prev2: u64) -> u64 {
|
|
std::cmp::max(prev2 + 1, std::cmp::max(prev + 1, now_msec()))
|
|
}
|
|
|
|
/// Convert a timestamp represented as milliseconds since UNIX Epoch to
|
|
/// its RFC3339 representation, such as "2021-01-01T12:30:00Z"
|
|
pub fn msec_to_rfc3339(msecs: u64) -> String {
|
|
let secs = msecs as i64 / 1000;
|
|
let nanos = (msecs as i64 % 1000) as u32 * 1_000_000;
|
|
let timestamp = Utc.timestamp_opt(secs, nanos).unwrap();
|
|
timestamp.to_rfc3339_opts(SecondsFormat::Millis, true)
|
|
}
|
|
|
|
/// Parse a systemd-style duration using fundu
|
|
pub fn parse_duration(s: &str) -> Result<Duration, Error> {
|
|
fundu_systemd::parse(s, Some(fundu::TimeUnit::Second), None)
|
|
.map_err(|err| Error::Message(err.to_string()))
|
|
.and_then(|dur| {
|
|
dur.try_into()
|
|
.map_err(|err: fundu::TryFromDurationError| Error::Message(err.to_string()))
|
|
})
|
|
}
|