Skip to main content

serde_duration_ext/
timetunit.rs

1use std::str::FromStr;
2
3use crate::error::Error;
4
5#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
6pub enum TimeUnit {
7    Nanosecond,
8    Microsecond,
9    Millisecond,
10    Second,
11    Minute,
12    Hour,
13    Day,
14    Week,
15}
16
17impl FromStr for TimeUnit {
18    type Err = Error;
19
20    fn from_str(s: &str) -> Result<Self, Self::Err> {
21        match s {
22            "ns" | "nanosecond" | "nanos" | "nanoseconds" => Ok(TimeUnit::Nanosecond),
23            "us" | "microsecond" | "micros" | "microseconds" => Ok(TimeUnit::Microsecond),
24            "ms" | "millisecond" | "millis" | "milliseconds" => Ok(TimeUnit::Millisecond),
25            "s" | "second" | "secs" | "seconds" => Ok(TimeUnit::Second),
26            "m" | "minute" | "mins" | "minutes" => Ok(TimeUnit::Minute),
27            "h" | "hour" | "hours" => Ok(TimeUnit::Hour),
28            "d" | "day" | "days" => Ok(TimeUnit::Day),
29            "w" | "week" | "weeks" => Ok(TimeUnit::Week),
30            _ => Err(Error::UnitNotSupported(format!(
31                "Unit '{}' not supported",
32                s
33            ))),
34        }
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[test]
43    fn test_from_str() {
44        assert_eq!("ns".parse(), Ok(TimeUnit::Nanosecond));
45        assert_eq!("nanosecond".parse(), Ok(TimeUnit::Nanosecond));
46        assert_eq!("nanos".parse(), Ok(TimeUnit::Nanosecond));
47        assert_eq!("nanoseconds".parse(), Ok(TimeUnit::Nanosecond));
48
49        assert_eq!("us".parse(), Ok(TimeUnit::Microsecond));
50        assert_eq!("microsecond".parse(), Ok(TimeUnit::Microsecond));
51        assert_eq!("micros".parse(), Ok(TimeUnit::Microsecond));
52        assert_eq!("microseconds".parse(), Ok(TimeUnit::Microsecond));
53
54        assert_eq!("ms".parse(), Ok(TimeUnit::Millisecond));
55        assert_eq!("millisecond".parse(), Ok(TimeUnit::Millisecond));
56        assert_eq!("millis".parse(), Ok(TimeUnit::Millisecond));
57        assert_eq!("milliseconds".parse(), Ok(TimeUnit::Millisecond));
58
59        assert_eq!("s".parse(), Ok(TimeUnit::Second));
60        assert_eq!("second".parse(), Ok(TimeUnit::Second));
61        assert_eq!("secs".parse(), Ok(TimeUnit::Second));
62        assert_eq!("seconds".parse(), Ok(TimeUnit::Second));
63
64        assert_eq!("m".parse(), Ok(TimeUnit::Minute));
65        assert_eq!("minute".parse(), Ok(TimeUnit::Minute));
66        assert_eq!("mins".parse(), Ok(TimeUnit::Minute));
67        assert_eq!("minutes".parse(), Ok(TimeUnit::Minute));
68
69        assert_eq!("h".parse(), Ok(TimeUnit::Hour));
70        assert_eq!("hour".parse(), Ok(TimeUnit::Hour));
71        assert_eq!("hours".parse(), Ok(TimeUnit::Hour));
72
73        assert_eq!("d".parse(), Ok(TimeUnit::Day));
74        assert_eq!("day".parse(), Ok(TimeUnit::Day));
75        assert_eq!("days".parse(), Ok(TimeUnit::Day));
76
77        assert_eq!("w".parse(), Ok(TimeUnit::Week));
78        assert_eq!("week".parse(), Ok(TimeUnit::Week));
79        assert_eq!("weeks".parse(), Ok(TimeUnit::Week));
80
81        assert!("foo".parse::<TimeUnit>().is_err());
82    }
83
84    #[test]
85    fn test_ord() {
86        assert!(TimeUnit::Nanosecond < TimeUnit::Microsecond);
87        assert!(TimeUnit::Microsecond < TimeUnit::Millisecond);
88        assert!(TimeUnit::Millisecond < TimeUnit::Second);
89        assert!(TimeUnit::Second < TimeUnit::Minute);
90        assert!(TimeUnit::Minute < TimeUnit::Hour);
91        assert!(TimeUnit::Hour < TimeUnit::Day);
92        assert!(TimeUnit::Day < TimeUnit::Week);
93    }
94}