diff options
Diffstat (limited to 'src/metric/time.rs')
-rw-r--r-- | src/metric/time.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/metric/time.rs b/src/metric/time.rs new file mode 100644 index 0000000..f4ff4b8 --- /dev/null +++ b/src/metric/time.rs @@ -0,0 +1,36 @@ +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 Time { + Base(f64, fn(f64) -> f64, &'static str), + Canonical(f64), + Second(f64), + Millisecond(f64), + Minute(f64), + Hour(f64), + Day(f64), + Year(f64), +} + +impl Unit<Time> for Time { + fn to_si_unit(&self) -> Time { + match self { + Time::Base(_, _, _) => self.clone(), + Time::Canonical(value) => Time::Base(value.clone(), |x| x, "s"), + Time::Second(value) => Time::Base(value.clone(), |x| x, "s"), + Time::Millisecond(value) => Time::Base(value / 1000.0, |x| x * 1000.0, "ms"), + Time::Minute(value) => Time::Base(value * 60.0, |x| x / 60.0, "min"), + Time::Hour(value) => Time::Base(value * 3600.0, |x| x / 3600.0, "h"), + Time::Day(value) => Time::Base(value * 86400.0, |x| x / 86400.0, "d"), + Time::Year(value) => Time::Base(value * 31536000.0, |x| x / 31536000.0, "a") + } + } +} + +declare_unit_basics!(Time);
\ No newline at end of file |