From 3a1e9d081cc299a0ce3e950282464986a36376d9 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 20 Jan 2023 20:04:28 -0330 Subject: refactor volume module --- src/volume.rs | 143 ---------------------------------------------------------- 1 file changed, 143 deletions(-) delete mode 100644 src/volume.rs (limited to 'src/volume.rs') diff --git a/src/volume.rs b/src/volume.rs deleted file mode 100644 index a288f7e..0000000 --- a/src/volume.rs +++ /dev/null @@ -1,143 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)] -pub enum Unit { - #[default] - CubicMetre, - Litre, - CubicCentimetre, -} - -impl Unit { - pub const ALL: [Self; 3] = [Self::CubicMetre, Self::Litre, Self::CubicCentimetre]; -} - -impl Display for Unit { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "{}", - match self { - Self::CubicMetre => "m³", - Self::Litre => "L", - Self::CubicCentimetre => "cc", - } - ) - } -} - -#[derive(Debug, Default, PartialEq)] -pub struct CubicMetre(pub f64); - -impl CubicMetre { - pub fn from_unit>(unit: Unit, value: F) -> Self { - match unit { - Unit::CubicMetre => Self(value.into()), - Unit::Litre => Self::from(Litre(value.into())), - Unit::CubicCentimetre => Self::from(CubicCentimetre(value.into())), - } - } -} - -impl From for CubicMetre { - fn from(value: Litre) -> Self { - Self(value.0 * 10_f64.powi(-3)) - } -} - -impl From for CubicMetre { - fn from(value: CubicCentimetre) -> Self { - Self(value.0 * 10_f64.powi(-6)) - } -} - -#[derive(Debug, PartialEq)] -struct Litre(f64); - -impl From for Litre { - fn from(value: CubicMetre) -> Self { - Self(value.0 * 10_f64.powi(3)) - } -} - -impl From for Litre { - fn from(value: CubicCentimetre) -> Self { - Self(value.0 * 10_f64.powi(-3)) - } -} - -#[derive(Debug, PartialEq)] -pub struct CubicCentimetre(f64); - -impl From for CubicCentimetre { - fn from(value: CubicMetre) -> Self { - Self(value.0 * 10_f64.powi(6)) - } -} - -impl From for CubicCentimetre { - fn from(value: Litre) -> Self { - Self(value.0 * 10_f64.powi(3)) - } -} - -pub fn convert>(val: F, from: Unit, to: Unit) -> f64 { - match from { - Unit::CubicMetre => match to { - Unit::CubicMetre => val.into(), - Unit::Litre => Litre::from(CubicMetre(val.into())).0, - Unit::CubicCentimetre => CubicCentimetre::from(CubicMetre(val.into())).0, - }, - Unit::Litre => match to { - Unit::Litre => val.into(), - Unit::CubicMetre => CubicMetre::from(Litre(val.into())).0, - Unit::CubicCentimetre => CubicCentimetre::from(Litre(val.into())).0, - }, - Unit::CubicCentimetre => match to { - Unit::CubicCentimetre => val.into(), - Unit::CubicMetre => CubicMetre::from(CubicCentimetre(val.into())).0, - Unit::Litre => Litre::from(CubicCentimetre(val.into())).0, - }, - } -} - -#[cfg(test)] -mod tests { - use super::{CubicCentimetre, CubicMetre, Litre}; - - #[test] - fn cubic_metre_to_litre() { - assert_eq!(Litre::from(CubicMetre(1.)), Litre(1000.)); - } - - #[test] - fn cubic_metre_to_cubic_centimetre() { - assert_eq!( - CubicCentimetre::from(CubicMetre(1.)), - CubicCentimetre(1_000_000.) - ); - } - - #[test] - fn litre_to_cubic_metre() { - assert_eq!(CubicMetre::from(Litre(1000.)), CubicMetre(1.)); - } - - #[test] - fn litre_to_cubic_centimetre() { - assert_eq!(CubicCentimetre::from(Litre(1.)), CubicCentimetre(1000.)); - } - - #[test] - fn cubic_centimetre_to_cubic_metre() { - assert_eq!( - CubicMetre::from(CubicCentimetre(1_000_000.)), - CubicMetre(1.) - ); - } - - #[test] - fn cubic_centimetre_to_litre() { - assert_eq!(Litre::from(CubicCentimetre(1000.)), Litre(1.)); - } -} -- cgit v1.2.3