Skip to main content

kinetic_common/
duration.rs

1//! Shared duration parsing utilities.
2
3use std::time::Duration;
4
5/// Parses a human-readable duration string into a [`Duration`].
6///
7/// Delegates to [`humantime::parse_duration`] which supports formats such as
8/// `"5s"`, `"1m 30s"`, `"2h"`, `"100ms"`, etc.
9///
10/// # Errors
11///
12/// Returns an error if the string cannot be parsed as a valid duration.
13pub fn parse_duration(s: &str) -> Result<Duration, humantime::DurationError> {
14    humantime::parse_duration(s.trim())
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn seconds() {
23        assert_eq!(parse_duration("5s").unwrap(), Duration::from_secs(5));
24        assert_eq!(parse_duration("60s").unwrap(), Duration::from_secs(60));
25    }
26
27    #[test]
28    fn minutes() {
29        assert_eq!(parse_duration("1m").unwrap(), Duration::from_secs(60));
30        assert_eq!(parse_duration("5m").unwrap(), Duration::from_secs(300));
31    }
32
33    #[test]
34    fn hours() {
35        assert_eq!(parse_duration("1h").unwrap(), Duration::from_secs(3600));
36    }
37
38    #[test]
39    fn milliseconds() {
40        assert_eq!(parse_duration("100ms").unwrap(), Duration::from_millis(100));
41    }
42
43    #[test]
44    fn whitespace_is_trimmed() {
45        assert_eq!(parse_duration("  5s  ").unwrap(), Duration::from_secs(5));
46    }
47
48    #[test]
49    fn empty_string_is_error() {
50        assert!(parse_duration("").is_err());
51    }
52
53    #[test]
54    fn invalid_string_is_error() {
55        assert!(parse_duration("not_a_duration").is_err());
56    }
57}