bo4e_core/enums/
unit_prefix.rs

1//! Unit prefix (Mengeneinheitenpraefix) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// SI unit prefix.
6///
7/// Metric prefixes used with units of measurement.
8///
9/// German: Mengeneinheitenpraefix
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum UnitPrefix {
13    /// Exa (10^18)
14    #[serde(rename = "EXA")]
15    Exa,
16
17    /// Peta (10^15)
18    #[serde(rename = "PETA")]
19    Peta,
20
21    /// Tera (10^12)
22    #[serde(rename = "TERA")]
23    Tera,
24
25    /// Giga (10^9)
26    #[serde(rename = "GIGA")]
27    Giga,
28
29    /// Mega (10^6)
30    #[serde(rename = "MEGA")]
31    Mega,
32
33    /// Kilo (10^3)
34    #[serde(rename = "KILO")]
35    Kilo,
36
37    /// Hecto (10^2)
38    #[serde(rename = "HEKTO")]
39    Hecto,
40
41    /// Deca (10^1)
42    #[serde(rename = "DEKA")]
43    Deca,
44
45    /// No prefix (10^0)
46    #[serde(rename = "OHNE")]
47    None,
48
49    /// Deci (10^-1)
50    #[serde(rename = "DEZI")]
51    Deci,
52
53    /// Centi (10^-2)
54    #[serde(rename = "ZENTI")]
55    Centi,
56
57    /// Milli (10^-3)
58    #[serde(rename = "MILLI")]
59    Milli,
60
61    /// Micro (10^-6)
62    #[serde(rename = "MIKRO")]
63    Micro,
64
65    /// Nano (10^-9)
66    #[serde(rename = "NANO")]
67    Nano,
68
69    /// Pico (10^-12)
70    #[serde(rename = "PIKO")]
71    Pico,
72
73    /// Femto (10^-15)
74    #[serde(rename = "FEMTO")]
75    Femto,
76
77    /// Atto (10^-18)
78    #[serde(rename = "ATTO")]
79    Atto,
80}
81
82impl UnitPrefix {
83    /// Returns the German name.
84    pub fn german_name(&self) -> &'static str {
85        match self {
86            Self::Exa => "Exa",
87            Self::Peta => "Peta",
88            Self::Tera => "Tera",
89            Self::Giga => "Giga",
90            Self::Mega => "Mega",
91            Self::Kilo => "Kilo",
92            Self::Hecto => "Hekto",
93            Self::Deca => "Deka",
94            Self::None => "Ohne",
95            Self::Deci => "Dezi",
96            Self::Centi => "Zenti",
97            Self::Milli => "Milli",
98            Self::Micro => "Mikro",
99            Self::Nano => "Nano",
100            Self::Pico => "Piko",
101            Self::Femto => "Femto",
102            Self::Atto => "Atto",
103        }
104    }
105
106    /// Returns the power of 10 for this prefix.
107    pub fn exponent(&self) -> i32 {
108        match self {
109            Self::Exa => 18,
110            Self::Peta => 15,
111            Self::Tera => 12,
112            Self::Giga => 9,
113            Self::Mega => 6,
114            Self::Kilo => 3,
115            Self::Hecto => 2,
116            Self::Deca => 1,
117            Self::None => 0,
118            Self::Deci => -1,
119            Self::Centi => -2,
120            Self::Milli => -3,
121            Self::Micro => -6,
122            Self::Nano => -9,
123            Self::Pico => -12,
124            Self::Femto => -15,
125            Self::Atto => -18,
126        }
127    }
128}
129
130#[cfg(test)]
131mod tests {
132    use super::*;
133
134    #[test]
135    fn test_serialize() {
136        assert_eq!(
137            serde_json::to_string(&UnitPrefix::Kilo).unwrap(),
138            r#""KILO""#
139        );
140        assert_eq!(
141            serde_json::to_string(&UnitPrefix::Mega).unwrap(),
142            r#""MEGA""#
143        );
144    }
145
146    #[test]
147    fn test_roundtrip() {
148        for prefix in [
149            UnitPrefix::Exa,
150            UnitPrefix::Kilo,
151            UnitPrefix::None,
152            UnitPrefix::Milli,
153            UnitPrefix::Nano,
154        ] {
155            let json = serde_json::to_string(&prefix).unwrap();
156            let parsed: UnitPrefix = serde_json::from_str(&json).unwrap();
157            assert_eq!(prefix, parsed);
158        }
159    }
160
161    #[test]
162    fn test_exponent() {
163        assert_eq!(UnitPrefix::Kilo.exponent(), 3);
164        assert_eq!(UnitPrefix::Mega.exponent(), 6);
165        assert_eq!(UnitPrefix::Milli.exponent(), -3);
166        assert_eq!(UnitPrefix::None.exponent(), 0);
167    }
168}