Drop parse_duration for fundu-systemd (#1246) (#1468)

`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>
This commit is contained in:
Wesley Hershberger
2026-06-17 13:57:21 +00:00
committed by Alex
parent 1d1456f1d6
commit 76aae3cb96
11 changed files with 54 additions and 83 deletions
+2
View File
@@ -22,6 +22,8 @@ arc-swap.workspace = true
async-trait.workspace = true
blake2.workspace = true
bytesize.workspace = true
fundu.workspace = true
fundu-systemd.workspace = true
thiserror.workspace = true
hexdump.workspace = true
xxhash-rust.workspace = true
+14 -1
View File
@@ -1,6 +1,9 @@
//! Module containing helper functions to manipulate time
use chrono::{SecondsFormat, TimeZone, Utc};
use std::time::{SystemTime, UNIX_EPOCH};
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 {
@@ -28,3 +31,13 @@ pub fn msec_to_rfc3339(msecs: u64) -> String {
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()))
})
}