bo4e_core/enums/
unit_prefix.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum UnitPrefix {
13 #[serde(rename = "EXA")]
15 Exa,
16
17 #[serde(rename = "PETA")]
19 Peta,
20
21 #[serde(rename = "TERA")]
23 Tera,
24
25 #[serde(rename = "GIGA")]
27 Giga,
28
29 #[serde(rename = "MEGA")]
31 Mega,
32
33 #[serde(rename = "KILO")]
35 Kilo,
36
37 #[serde(rename = "HEKTO")]
39 Hecto,
40
41 #[serde(rename = "DEKA")]
43 Deca,
44
45 #[serde(rename = "OHNE")]
47 None,
48
49 #[serde(rename = "DEZI")]
51 Deci,
52
53 #[serde(rename = "ZENTI")]
55 Centi,
56
57 #[serde(rename = "MILLI")]
59 Milli,
60
61 #[serde(rename = "MIKRO")]
63 Micro,
64
65 #[serde(rename = "NANO")]
67 Nano,
68
69 #[serde(rename = "PIKO")]
71 Pico,
72
73 #[serde(rename = "FEMTO")]
75 Femto,
76
77 #[serde(rename = "ATTO")]
79 Atto,
80}
81
82impl UnitPrefix {
83 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 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}