diff options
Diffstat (limited to 'src/volume.rs')
| -rw-r--r-- | src/volume.rs | 53 |
1 files changed, 53 insertions, 0 deletions
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<i32> for Litre { + fn from(value: i32) -> Self { + Self(value as f64) + } +} + +impl From<CubicMetre> for Litre { + fn from(value: CubicMetre) -> Self { + Self(value.0 * 10_f64.powf(3.)) + } +} + +impl Mul<f64> 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.)) + } +} |