Skip to main content

routee_compass_core/model/unit/
temperature_unit.rs

1use std::str::FromStr;
2
3use serde::{Deserialize, Serialize};
4use uom::si::f64::ThermodynamicTemperature;
5
6#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Copy, Hash, PartialOrd, Default)]
7#[serde(rename_all = "snake_case")]
8pub enum TemperatureUnit {
9    Fahrenheit,
10    Celsius,
11    #[default]
12    Kelvin,
13}
14
15impl TemperatureUnit {
16    pub fn to_uom(&self, value: f64) -> ThermodynamicTemperature {
17        use TemperatureUnit as G;
18        match self {
19            G::Fahrenheit => ThermodynamicTemperature::new::<
20                uom::si::thermodynamic_temperature::degree_fahrenheit,
21            >(value),
22            G::Celsius => ThermodynamicTemperature::new::<
23                uom::si::thermodynamic_temperature::degree_celsius,
24            >(value),
25            G::Kelvin => {
26                ThermodynamicTemperature::new::<uom::si::thermodynamic_temperature::kelvin>(value)
27            }
28        }
29    }
30    pub fn from_uom(&self, value: ThermodynamicTemperature) -> f64 {
31        use TemperatureUnit as G;
32        match self {
33            G::Fahrenheit => value.get::<uom::si::thermodynamic_temperature::degree_fahrenheit>(),
34            G::Celsius => value.get::<uom::si::thermodynamic_temperature::degree_celsius>(),
35            G::Kelvin => value.get::<uom::si::thermodynamic_temperature::kelvin>(),
36        }
37    }
38}
39
40impl std::fmt::Display for TemperatureUnit {
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        let s = serde_json::to_string(self)
43            .map_err(|_| std::fmt::Error)?
44            .replace('\"', "");
45        write!(f, "{s}")
46    }
47}
48
49impl FromStr for TemperatureUnit {
50    type Err = serde_json::Error;
51    fn from_str(s: &str) -> Result<Self, Self::Err> {
52        crate::util::serde::serde_ops::string_deserialize(s)
53    }
54}