metrum 1.1.0

Easily work with and compare temeratures in different units
Documentation
use super::Temp;
use std::ops::Sub;

#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct TempDelta {
    pub value: f64,
}

impl TempDelta {
    pub fn as_f(&self) -> f64 {
        self.value * (9. / 5.)
    }

    pub fn as_c(&self) -> f64 {
        self.value
    }

    pub fn as_k(&self) -> f64 {
        self.value
    }
}

impl Sub for Temp {
    type Output = TempDelta;

    fn sub(self, rhs: Self) -> Self::Output {
        let k1 = self.as_k();
        let k2 = rhs.as_k();

        TempDelta {
            value: (k1 - k2).abs(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn foo() {
        let cc = Temp::from_c(10.) - Temp::from_f(25.);

        assert_eq!(cc.as_f(), 25.000000000000046);
    }

    #[test]
    fn should_sub_from_c() {
        let cc = Temp::from_c(10.) - Temp::from_c(10.);
        let cf = Temp::from_c(10.) - Temp::from_f(50.);
        let ck = Temp::from_c(10.) - Temp::from_k(283.15);

        assert_eq!(cc, TempDelta { value: 0. });
        assert_eq!(cf, TempDelta { value: 0. });
        assert_eq!(ck, TempDelta { value: 0. });
    }

    #[test]
    fn should_sub_from_f() {
        let ff = Temp::from_f(32.) - Temp::from_f(32.);
        let fc = Temp::from_f(32.) - Temp::from_c(0.);
        let fk = Temp::from_f(32.) - Temp::from_k(273.15);

        assert_eq!(ff, TempDelta { value: 0. });
        assert_eq!(fc, TempDelta { value: 0. });
        assert_eq!(fk, TempDelta { value: 0. });
    }

    #[test]
    fn should_sub_from_k() {
        let kk = Temp::from_k(300.) - Temp::from_k(300.);
        let kc = Temp::from_k(300.) - Temp::from_c(26.85);
        let kf = Temp::from_k(300.) - Temp::from_f(80.33);

        assert_eq!(kk, TempDelta { value: 0. });
        assert_eq!(kf, TempDelta { value: 0. });
        assert_eq!(kc, TempDelta { value: 0. });
    }

    #[test]
    fn should_handle_negative_temperatures() {
        let cc = Temp::from_c(-10.) - Temp::from_c(-20.);
        let ff = Temp::from_f(14.) - Temp::from_f(-4.);

        assert_eq!(cc, TempDelta { value: 10. });
        assert_eq!(ff, TempDelta { value: 10. });
    }
}