1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum Unit {
13 #[serde(rename = "W")]
16 Watt,
17
18 #[serde(rename = "KW")]
20 Kilowatt,
21
22 #[serde(rename = "MW")]
24 Megawatt,
25
26 #[serde(rename = "WH")]
29 WattHour,
30
31 #[serde(rename = "KWH")]
33 KilowattHour,
34
35 #[serde(rename = "MWH")]
37 MegawattHour,
38
39 #[serde(rename = "VAR")]
42 VoltAmpereReactive,
43
44 #[serde(rename = "KVAR")]
46 KilovoltAmpereReactive,
47
48 #[serde(rename = "VARH")]
50 VoltAmpereReactiveHour,
51
52 #[serde(rename = "KVARH")]
54 KilovoltAmpereReactiveHour,
55
56 #[serde(rename = "KUBIKMETER")]
59 CubicMeter,
60
61 #[serde(rename = "STUECK")]
64 Piece,
65
66 #[serde(rename = "SEKUNDE")]
69 Second,
70
71 #[serde(rename = "MINUTE")]
73 Minute,
74
75 #[serde(rename = "STUNDE")]
77 Hour,
78
79 #[serde(rename = "VIERTEL_STUNDE")]
81 QuarterHour,
82
83 #[serde(rename = "TAG")]
85 Day,
86
87 #[serde(rename = "WOCHE")]
89 Week,
90
91 #[serde(rename = "MONAT")]
93 Month,
94
95 #[serde(rename = "QUARTAL")]
97 Quarter,
98
99 #[serde(rename = "HALBJAHR")]
101 HalfYear,
102
103 #[serde(rename = "JAHR")]
105 Year,
106
107 #[serde(rename = "PROZENT")]
110 Percent,
111
112 #[serde(rename = "KWHK")]
114 KilowattHourPerKelvin,
115}
116
117impl Unit {
118 pub fn german_name(&self) -> &'static str {
120 match self {
121 Self::Watt => "Watt",
122 Self::Kilowatt => "Kilowatt",
123 Self::Megawatt => "Megawatt",
124 Self::WattHour => "Wattstunde",
125 Self::KilowattHour => "Kilowattstunde",
126 Self::MegawattHour => "Megawattstunde",
127 Self::VoltAmpereReactive => "Var",
128 Self::KilovoltAmpereReactive => "Kilovar",
129 Self::VoltAmpereReactiveHour => "Varstunde",
130 Self::KilovoltAmpereReactiveHour => "Kilovarstunde",
131 Self::CubicMeter => "Kubikmeter",
132 Self::Piece => "Stück",
133 Self::Second => "Sekunde",
134 Self::Minute => "Minute",
135 Self::Hour => "Stunde",
136 Self::QuarterHour => "Viertelstunde",
137 Self::Day => "Tag",
138 Self::Week => "Woche",
139 Self::Month => "Monat",
140 Self::Quarter => "Quartal",
141 Self::HalfYear => "Halbjahr",
142 Self::Year => "Jahr",
143 Self::Percent => "Prozent",
144 Self::KilowattHourPerKelvin => "Kilowattstunde pro Kelvin",
145 }
146 }
147}
148
149#[cfg(test)]
150mod tests {
151 use super::*;
152
153 #[test]
154 fn test_serialize() {
155 assert_eq!(
156 serde_json::to_string(&Unit::KilowattHour).unwrap(),
157 r#""KWH""#
158 );
159 assert_eq!(
160 serde_json::to_string(&Unit::CubicMeter).unwrap(),
161 r#""KUBIKMETER""#
162 );
163 }
164
165 #[test]
166 fn test_deserialize() {
167 assert_eq!(
168 serde_json::from_str::<Unit>(r#""MWH""#).unwrap(),
169 Unit::MegawattHour
170 );
171 }
172
173 #[test]
174 fn test_roundtrip() {
175 for unit in [
176 Unit::Watt,
177 Unit::Kilowatt,
178 Unit::Megawatt,
179 Unit::WattHour,
180 Unit::KilowattHour,
181 Unit::MegawattHour,
182 Unit::VoltAmpereReactive,
183 Unit::KilovoltAmpereReactive,
184 Unit::VoltAmpereReactiveHour,
185 Unit::KilovoltAmpereReactiveHour,
186 Unit::CubicMeter,
187 Unit::Piece,
188 Unit::Second,
189 Unit::Minute,
190 Unit::Hour,
191 Unit::QuarterHour,
192 Unit::Day,
193 Unit::Week,
194 Unit::Month,
195 Unit::Quarter,
196 Unit::HalfYear,
197 Unit::Year,
198 Unit::Percent,
199 Unit::KilowattHourPerKelvin,
200 ] {
201 let json = serde_json::to_string(&unit).unwrap();
202 let parsed: Unit = serde_json::from_str(&json).unwrap();
203 assert_eq!(unit, parsed);
204 }
205 }
206}