use super::*;
use crate::number::*;
pub trait Quantity: Number + HasValue {
type Value: Number;
type Length: ScaleFactor; type Mass: ScaleFactor; type Time: ScaleFactor; type Current: ScaleFactor; type Temperature: ScaleFactor;
fn is_volt(&self) -> bool {
Self::Length::PREFIX == 0
&& Self::Length::EXPONENT == 2
&& Self::Mass::PREFIX == 3
&& Self::Mass::EXPONENT == 1
&& Self::Time::PREFIX == 0
&& Self::Time::EXPONENT == -3
&& Self::Current::PREFIX == 0
&& Self::Current::EXPONENT == -1
&& Self::Temperature::EXPONENT == 0
}
fn is_hertz(&self) -> bool {
Self::Length::EXPONENT == 0
&& Self::Mass::EXPONENT == 0
&& Self::Time::PREFIX == 0
&& Self::Time::EXPONENT == -1
&& Self::Current::EXPONENT == 0
&& Self::Temperature::EXPONENT == 0
}
fn is_watt(&self) -> bool {
Self::Length::PREFIX == 0
&& Self::Length::EXPONENT == 2
&& Self::Mass::PREFIX == 3
&& Self::Mass::EXPONENT == 1
&& Self::Time::PREFIX == 0
&& Self::Time::EXPONENT == -3
&& Self::Current::EXPONENT == 0
&& Self::Temperature::EXPONENT == 0
}
fn base_unit(&self) -> String {
let mut sep = false;
let mut s = String::new();
if Self::Length::EXPONENT != 0 {
s += &pretty::<Self::Length>("m");
sep = true;
}
if Self::Mass::EXPONENT != 0 {
if sep {
s += ".";
}
s += &pretty::<Self::Mass>("g");
sep = true;
}
if Self::Time::EXPONENT != 0 {
if sep {
s += ".";
}
s += &pretty::<Self::Time>("s");
sep = true;
}
if Self::Current::EXPONENT != 0 {
if sep {
s += ".";
}
s += &pretty::<Self::Current>("A");
sep = true;
}
if Self::Temperature::EXPONENT != 0 {
if sep {
s += ".";
}
s += &pretty::<Self::Temperature>("K");
}
s
}
fn unit(&self) -> String {
if self.is_volt() {
return "V".to_string();
}
if self.is_hertz() {
return "Hz".to_string();
}
if self.is_watt() {
return "W".to_string();
}
self.base_unit()
}
}