From b6247a8372eb18a19c35a924316941d6c1e585d2 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Sun, 15 Jan 2023 22:40:41 -0330 Subject: volume --- src/volume.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/volume.rs (limited to 'src/volume.rs') diff --git a/src/volume.rs b/src/volume.rs new file mode 100644 index 0000000..ea78938 --- /dev/null +++ b/src/volume.rs @@ -0,0 +1,53 @@ +use std::ops::Mul; + +trait Volume { + /// Returns the volume in SI units (cubic metres). + fn si(self) -> CubicMetre; +} + +#[derive(Debug, PartialEq)] +struct CubicMetre(f64); + +#[derive(Debug, PartialEq)] +struct Litre(f64); + +impl Volume for Litre { + fn si(self) -> CubicMetre { + CubicMetre(self.0 * 10_f64.powf(-3.)) + } +} + +impl From for Litre { + fn from(value: i32) -> Self { + Self(value as f64) + } +} + +impl From for Litre { + fn from(value: CubicMetre) -> Self { + Self(value.0 * 10_f64.powf(3.)) + } +} + +impl Mul for Litre { + type Output = Self; + + fn mul(self, rhs: f64) -> Self::Output { + Self(self.0 * rhs) + } +} + +#[cfg(test)] +mod tests { + use crate::volume::{CubicMetre, Litre, Volume}; + + #[test] + fn litre_to_cubic_metre() { + assert_eq!(Litre(1000.).si(), CubicMetre(1.)) + } + + #[test] + fn cubic_metre_to_litre() { + assert_eq!(Litre::from(CubicMetre(1.)), Litre(1000.)) + } +} -- cgit v1.2.3