routee_compass_core/model/unit/
temperature_unit.rs1use 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}