use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum UnitPrefix {
#[serde(rename = "EXA")]
Exa,
#[serde(rename = "PETA")]
Peta,
#[serde(rename = "TERA")]
Tera,
#[serde(rename = "GIGA")]
Giga,
#[serde(rename = "MEGA")]
Mega,
#[serde(rename = "KILO")]
Kilo,
#[serde(rename = "HEKTO")]
Hecto,
#[serde(rename = "DEKA")]
Deca,
#[serde(rename = "OHNE")]
None,
#[serde(rename = "DEZI")]
Deci,
#[serde(rename = "ZENTI")]
Centi,
#[serde(rename = "MILLI")]
Milli,
#[serde(rename = "MIKRO")]
Micro,
#[serde(rename = "NANO")]
Nano,
#[serde(rename = "PIKO")]
Pico,
#[serde(rename = "FEMTO")]
Femto,
#[serde(rename = "ATTO")]
Atto,
}
impl UnitPrefix {
pub fn german_name(&self) -> &'static str {
match self {
Self::Exa => "Exa",
Self::Peta => "Peta",
Self::Tera => "Tera",
Self::Giga => "Giga",
Self::Mega => "Mega",
Self::Kilo => "Kilo",
Self::Hecto => "Hekto",
Self::Deca => "Deka",
Self::None => "Ohne",
Self::Deci => "Dezi",
Self::Centi => "Zenti",
Self::Milli => "Milli",
Self::Micro => "Mikro",
Self::Nano => "Nano",
Self::Pico => "Piko",
Self::Femto => "Femto",
Self::Atto => "Atto",
}
}
pub fn exponent(&self) -> i32 {
match self {
Self::Exa => 18,
Self::Peta => 15,
Self::Tera => 12,
Self::Giga => 9,
Self::Mega => 6,
Self::Kilo => 3,
Self::Hecto => 2,
Self::Deca => 1,
Self::None => 0,
Self::Deci => -1,
Self::Centi => -2,
Self::Milli => -3,
Self::Micro => -6,
Self::Nano => -9,
Self::Pico => -12,
Self::Femto => -15,
Self::Atto => -18,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
assert_eq!(
serde_json::to_string(&UnitPrefix::Kilo).unwrap(),
r#""KILO""#
);
assert_eq!(
serde_json::to_string(&UnitPrefix::Mega).unwrap(),
r#""MEGA""#
);
}
#[test]
fn test_roundtrip() {
for prefix in [
UnitPrefix::Exa,
UnitPrefix::Kilo,
UnitPrefix::None,
UnitPrefix::Milli,
UnitPrefix::Nano,
] {
let json = serde_json::to_string(&prefix).unwrap();
let parsed: UnitPrefix = serde_json::from_str(&json).unwrap();
assert_eq!(prefix, parsed);
}
}
#[test]
fn test_exponent() {
assert_eq!(UnitPrefix::Kilo.exponent(), 3);
assert_eq!(UnitPrefix::Mega.exponent(), 6);
assert_eq!(UnitPrefix::Milli.exponent(), -3);
assert_eq!(UnitPrefix::None.exponent(), 0);
}
}