Skip to main content

routee_compass_core/model/unit/
time_unit.rs

1use 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}