serde_duration_ext/
timetunit.rs1use 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}