routee_compass_core/model/unit/
time_unit.rs1use serde::{Deserialize, Serialize};
2use std::str::FromStr;
3
4#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default, Hash, PartialOrd)]
5#[serde(rename_all = "snake_case")]
6pub enum TimeUnit {
7 Hours,
8 #[default]
9 Minutes,
10 Seconds,
11 Milliseconds,
12}
13
14impl TimeUnit {
15 pub fn to_uom(&self, value: f64) -> uom::si::f64::Time {
16 match self {
17 TimeUnit::Hours => uom::si::f64::Time::new::<uom::si::time::hour>(value),
18 TimeUnit::Minutes => uom::si::f64::Time::new::<uom::si::time::minute>(value),
19 TimeUnit::Seconds => uom::si::f64::Time::new::<uom::si::time::second>(value),
20 TimeUnit::Milliseconds => uom::si::f64::Time::new::<uom::si::time::millisecond>(value),
21 }
22 }
23 pub fn from_uom(&self, value: uom::si::f64::Time) -> f64 {
24 match self {
25 TimeUnit::Hours => value.get::<uom::si::time::hour>(),
26 TimeUnit::Minutes => value.get::<uom::si::time::minute>(),
27 TimeUnit::Seconds => value.get::<uom::si::time::second>(),
28 TimeUnit::Milliseconds => value.get::<uom::si::time::millisecond>(),
29 }
30 }
31}
32
33impl std::fmt::Display for TimeUnit {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 let s = serde_json::to_string(self)
36 .map_err(|_| std::fmt::Error)?
37 .replace('\"', "");
38 write!(f, "{s}")
39 }
40}
41
42impl FromStr for TimeUnit {
43 type Err = String;
44 fn from_str(s: &str) -> Result<Self, Self::Err> {
45 match s {
46 "hour" | "hours" | "hr" | "hrs" | "h" => Ok(TimeUnit::Hours),
47 "minute" | "minutes" | "min" | "mins" | "m" => Ok(TimeUnit::Minutes),
48 "second" | "seconds" | "sec" | "secs" | "s" => Ok(TimeUnit::Seconds),
49 "millisecond" | "milliseconds" | "ms" => Ok(TimeUnit::Milliseconds),
50 _ => Err(format!("unknown time unit '{s}'")),
51 }
52 }
53}
54
55impl TryFrom<String> for TimeUnit {
56 type Error = String;
57 fn try_from(value: String) -> Result<Self, Self::Error> {
58 Self::from_str(&value)
59 }
60}