unitx_core/
temperature.rs

1#[derive(Clone, Copy, Debug)]
2pub enum TemperatureUnit {
3    C,
4    F,
5    K,
6}
7
8impl TemperatureUnit {
9    pub fn parse(s: &str) -> Option<Self> {
10        match s.to_ascii_uppercase().as_str() {
11            "C" => Some(Self::C),
12            "F" => Some(Self::F),
13            "K" => Some(Self::K),
14            _ => None,
15        }
16    }
17}
18
19pub fn convert(value: f64, from: TemperatureUnit, to: TemperatureUnit) -> f64 {
20    // normalize to Kelvin
21    let k = match from {
22        TemperatureUnit::C => value + 273.15,
23        TemperatureUnit::F => (value - 32.0) * 5.0 / 9.0 + 273.15,
24        TemperatureUnit::K => value,
25    };
26    // Kelvin -> target
27    match to {
28        TemperatureUnit::C => k - 273.15,
29        TemperatureUnit::F => (k - 273.15) * 9.0 / 5.0 + 32.0,
30        TemperatureUnit::K => k,
31    }
32}