use crate::Magnitude;
use core::fmt;
pub use all::*;
pub(crate) mod all {
#[doc(inline)]
pub use super::{
amount::Amount,
current::Current,
intensity::Intensity,
length::{Distance, Height, Length},
mass::Mass,
temperature::Temperature,
time::Time,
};
#[doc(inline)]
pub use super::{
acceleration::Acceleration,
area::Area,
charge::Charge,
density::Density,
energy::{Energy, Work},
force::{Force, Weight},
frequency::Frequency,
gfs::{Gfs, GravitationalFieldStrength},
moment::{Moment, Torque},
momentum::Momentum,
power::Power,
pressure::Pressure,
speed::Speed,
velocity::Velocity,
volume::Volume,
};
}
mod amount;
mod current;
mod intensity;
mod length;
mod mass;
mod temperature;
mod time;
mod area; mod charge;
mod density;
mod energy;
mod frequency;
mod power;
mod pressure;
mod speed; mod volume;
mod acceleration; mod force;
mod gfs; mod moment; mod momentum; mod velocity;
pub mod kinematics {
#[doc(inline)]
pub use crate::units::{Distance, Length, Speed, Time};
}
pub mod dynamics {
#[doc(inline)]
pub use crate::units::{Force, Velocity};
}
pub trait Unit {
fn unit() -> String;
fn unit_long_s(&self) -> String;
fn unit_long_p(&self) -> String;
fn unit_long(&self) -> String;
fn long(&self) -> String;
}
macro_rules! impl_unit {
($type:ty, $short:expr, $lsingular:expr, $lplural:expr, $method_name:ident) => {
impl fmt::Display for $type {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{} {}", self.m(), Self::unit())
}
}
impl Unit for $type {
fn unit() -> String {
$short.into()
}
fn unit_long_s(&self) -> String {
$lsingular.into()
}
fn unit_long_p(&self) -> String {
$lplural.into()
}
fn unit_long(&self) -> String {
if (self.m() - 1.).abs() < Magnitude::EPSILON {
$lsingular.into()
} else {
$lplural.into()
}
}
fn long(&self) -> String {
format!["{} {}", self.m(), self.unit_long()]
}
}
};
}
impl_unit!(Time, "s", "second", "seconds", seconds);
impl_unit!(Length, "m", "metre", "metres", metres);
impl_unit!(Mass, "kg", "kilogram", "kilograms", kilograms);
impl_unit!(Current, "A", "ampere", "amperes", amperes);
impl_unit!(Temperature, "K", "kelvin", "kelvins", kelvins);
impl_unit!(Intensity, "cd", "candela", "candelas", candelas);
impl_unit!(Amount, "mol", "mole", "moles", moles);
impl_unit!(Area, "m²", "square metre", "square metres", square_metres);
impl_unit!(Charge, "C", "coulomb", "coulombs", coulombs);
impl_unit!(Energy, "J", "joule", "joules", joules);
impl_unit!(Frequency, "Hz", "hertz", "hertzs", hertzs);
impl_unit!(Power, "W", "watt", "watts", watts);
impl_unit!(Pressure, "Pa", "pascal", "pascals", pascals);
impl_unit!(
Speed,
"m/s",
"metre per second",
"metres per second",
metres_per_second
);
impl_unit!(Volume, "m³", "cubic metre", "cubic metres", cubic_metres);
impl_unit!(
Acceleration,
"m/s²",
"metre per second squared",
"metres per second squared",
metres_per_second_squared
);
impl_unit!(Force, "N", "newton", "newtons", newtons);
impl_unit!(
GravitationalFieldStrength,
"N/kg",
"newton per kilogram",
"newtons per kilogram",
newtons_per_kilogram
);
impl_unit!(
Moment,
"Nm",
"newton per metre",
"newtons per metre",
newtons_per_metre
);
impl_unit!(
Momentum,
"kg m/s",
"kilogram metre per second",
"kilograms metre per second",
kilograms_metres_per_second
);
impl_unit!(
Velocity,
"m/s",
"metre per second",
"metres per second",
metres_per_second
);