use std::fmt::{Display, Formatter, Result}; use std::ops::{Add, Sub, AddAssign, SubAssign, Div, Mul, DivAssign, MulAssign}; use crate::metric::Unit; use crate::metric::Primitive; use crate::declare_unit_basics; #[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] pub enum Mass { Base(f64, fn(f64) -> f64, &'static str), Canonical(f64), Kilogram(f64), Milligram(f64), Gram(f64), Tonne(f64), Ounce(f64), // international avoirdupois ounce Pound(f64), // International avoirdupois pound } impl Unit for Mass { fn to_si_unit(&self) -> Mass { match self { Mass::Base(_, _, _) => self.clone(), Mass::Canonical(value) => Mass::Base(value.clone(), |x| x, "kg"), Mass::Kilogram(value) => Mass::Base(value.clone(), |x| x, "kg"), Mass::Gram(value) => Mass::Base(value / 1000.0, |x| x * 1000.0, "g"), Mass::Milligram(value) => Mass::Base(value / 1_000_000.0, |x| x * 1_000_000.0, "mg"), Mass::Tonne(value) => Mass::Base(value * 1000.0, |x| x / 1000.0, "t"), Mass::Ounce(value) => Mass::Base(value * 28.349523125 / 1000.0, |x| x / 28.349523125 * 1000.0, "℥"), Mass::Pound(value) => Mass::Base(value * 0.45359237, |x| x / 0.45359237, "lb"), } } } declare_unit_basics!(Mass);