use strum_macros::{Display, EnumString};
#[derive(Debug, Copy, Clone)]
pub(crate) enum Error{
PrefixConvert(strum::ParseError)
}
#[derive(Debug, Clone, PartialEq)]
#[derive(Default, Display, EnumString)]
pub(crate) enum Prefix {
#[strum(serialize = "Q")]
Quetta = 30,
#[strum(serialize = "R")]
Ronna = 27,
#[strum(serialize = "Y")]
Yotta = 24,
#[strum(serialize = "Z")]
Zetta = 21,
#[strum(serialize = "E")]
Exa = 18,
#[strum(serialize = "P")]
Peta = 15,
#[strum(serialize = "T")]
Tera = 12,
#[strum(serialize = "G")]
Giga = 9,
#[strum(serialize = "M")]
Mega = 6,
#[strum(serialize = "k")]
Kilo = 3,
#[strum(serialize = "h")]
Hecto = 2,
#[strum(serialize = "da")]
Deca = 1,
#[default]
#[strum(serialize = "\0")]
_Unit = 0,
#[strum(serialize = "d")]
Deci = -1,
#[strum(serialize = "c")]
Centi = -2,
#[strum(serialize = "m")]
Milli = -3,
#[strum(serialize = "u")]
Micro = -6,
#[strum(serialize = "n")]
Nano = -9,
#[strum(serialize = "p")]
Pico = -12,
#[strum(serialize = "f")]
Femto = -15,
#[strum(serialize = "a")]
Atto = -18,
#[strum(serialize = "z")]
Zepto = -21,
#[strum(serialize = "y")]
Yocto = -24,
#[strum(serialize = "r")]
Ronto = -27,
#[strum(serialize = "q")]
Quecto = -30,
}
impl Prefix {
pub(crate) fn from_symbol(s: &str) -> Result<Prefix, Error> {
use std::str::FromStr;
match Self::from_str(s) {
Ok(prefix) => { Ok(prefix) }
Err(e) => { Err(Error::PrefixConvert(e)) }
}
}
}
#[derive(Debug, Copy, Clone)]
#[derive(Default, Display, EnumString)]
enum Suffix {
#[default]
#[strum(serialize = "")]
Scalar,
#[strum(serialize = "A")]
Ampere,
#[strum(serialize = "V")]
Volt,
#[strum(serialize = "W")]
Watt,
#[strum(serialize = "m",serialize = "M")]
Metre,
Second,
DegreeCelsius,
Farad,
Joule,
Ohm,
}
#[derive(Debug, Clone)]
pub struct Unit {
scale: f64,
prefix: Prefix,
suffix: Suffix,
}
impl Unit {
}
#[readonly::make]
#[allow(missing_docs)]
#[derive(Debug, Clone)]
pub struct Units{
pub time_unit: Unit,
pub capacitance_unit: Unit,
pub voltage_unit: Unit,
pub resistance_unit: Unit,
pub pulling_resistance_unit: Unit,
pub current_unit: Unit,
pub power_unit: Unit,
pub distance_unit: Unit,
pub scalar_unit: Unit,
}
impl Units {
}
#[cfg(test)]
mod test {
mod prefix {
use crate::units::Prefix;
static SYMBOLS_PREFIXS: [(&str,Prefix); 25] =
[
("Q", Prefix::Quetta ),
("R", Prefix::Ronna ),
("Y", Prefix::Yotta ),
("Z", Prefix::Zetta ),
("E", Prefix::Exa ),
("P", Prefix::Peta ),
("T", Prefix::Tera ),
("G", Prefix::Giga ),
("M", Prefix::Mega ),
("k", Prefix::Kilo ),
("h", Prefix::Hecto ),
("da", Prefix::Deca ),
("\0", Prefix::_Unit ),
("d", Prefix::Deci ),
("c", Prefix::Centi ),
("m", Prefix::Milli ),
("u", Prefix::Micro ),
("n", Prefix::Nano ),
("p", Prefix::Pico ),
("f", Prefix::Femto ),
("a", Prefix::Atto ),
("z", Prefix::Zepto ),
("y", Prefix::Yocto ),
("r", Prefix::Ronto ),
("q", Prefix::Quecto ),
];
#[test]
fn convert() {
for (symbol,prefix) in SYMBOLS_PREFIXS.iter(){
println!("{:?} <-> {:?}",symbol, prefix);
match Prefix::from_symbol(symbol) {
Ok(new_prefix) => { assert_eq!(new_prefix,prefix.clone()); }
Err(e) => { panic!("{:?}",e) }
}
}
}
}
}