1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
12#[cfg_attr(feature = "json-schema", schemars(rename = "Mengeneinheit"))]
13#[non_exhaustive]
14pub enum Unit {
15 #[serde(rename = "W")]
18 Watt,
19
20 #[serde(rename = "KW")]
22 Kilowatt,
23
24 #[serde(rename = "MW")]
26 Megawatt,
27
28 #[serde(rename = "WH")]
31 WattHour,
32
33 #[serde(rename = "KWH")]
35 KilowattHour,
36
37 #[serde(rename = "MWH")]
39 MegawattHour,
40
41 #[serde(rename = "VAR")]
44 VoltAmpereReactive,
45
46 #[serde(rename = "KVAR")]
48 KilovoltAmpereReactive,
49
50 #[serde(rename = "VARH")]
52 VoltAmpereReactiveHour,
53
54 #[serde(rename = "KVARH")]
56 KilovoltAmpereReactiveHour,
57
58 #[serde(rename = "KUBIKMETER")]
61 CubicMeter,
62
63 #[serde(rename = "STUECK")]
66 Piece,
67
68 #[serde(rename = "SEKUNDE")]
71 Second,
72
73 #[serde(rename = "MINUTE")]
75 Minute,
76
77 #[serde(rename = "STUNDE")]
79 Hour,
80
81 #[serde(rename = "VIERTEL_STUNDE")]
83 QuarterHour,
84
85 #[serde(rename = "TAG")]
87 Day,
88
89 #[serde(rename = "WOCHE")]
91 Week,
92
93 #[serde(rename = "MONAT")]
95 Month,
96
97 #[serde(rename = "QUARTAL")]
99 Quarter,
100
101 #[serde(rename = "HALBJAHR")]
103 HalfYear,
104
105 #[serde(rename = "JAHR")]
107 Year,
108
109 #[serde(rename = "PROZENT")]
112 Percent,
113
114 #[serde(rename = "KWHK")]
116 KilowattHourPerKelvin,
117}
118
119impl Unit {
120 pub fn german_name(&self) -> &'static str {
122 match self {
123 Self::Watt => "Watt",
124 Self::Kilowatt => "Kilowatt",
125 Self::Megawatt => "Megawatt",
126 Self::WattHour => "Wattstunde",
127 Self::KilowattHour => "Kilowattstunde",
128 Self::MegawattHour => "Megawattstunde",
129 Self::VoltAmpereReactive => "Var",
130 Self::KilovoltAmpereReactive => "Kilovar",
131 Self::VoltAmpereReactiveHour => "Varstunde",
132 Self::KilovoltAmpereReactiveHour => "Kilovarstunde",
133 Self::CubicMeter => "Kubikmeter",
134 Self::Piece => "Stück",
135 Self::Second => "Sekunde",
136 Self::Minute => "Minute",
137 Self::Hour => "Stunde",
138 Self::QuarterHour => "Viertelstunde",
139 Self::Day => "Tag",
140 Self::Week => "Woche",
141 Self::Month => "Monat",
142 Self::Quarter => "Quartal",
143 Self::HalfYear => "Halbjahr",
144 Self::Year => "Jahr",
145 Self::Percent => "Prozent",
146 Self::KilowattHourPerKelvin => "Kilowattstunde pro Kelvin",
147 }
148 }
149}
150
151#[cfg(test)]
152mod tests {
153 use super::*;
154
155 #[test]
156 fn test_serialize() {
157 assert_eq!(
158 serde_json::to_string(&Unit::KilowattHour).unwrap(),
159 r#""KWH""#
160 );
161 assert_eq!(
162 serde_json::to_string(&Unit::CubicMeter).unwrap(),
163 r#""KUBIKMETER""#
164 );
165 }
166
167 #[test]
168 fn test_deserialize() {
169 assert_eq!(
170 serde_json::from_str::<Unit>(r#""MWH""#).unwrap(),
171 Unit::MegawattHour
172 );
173 }
174
175 #[test]
176 fn test_roundtrip() {
177 for unit in [
178 Unit::Watt,
179 Unit::Kilowatt,
180 Unit::Megawatt,
181 Unit::WattHour,
182 Unit::KilowattHour,
183 Unit::MegawattHour,
184 Unit::VoltAmpereReactive,
185 Unit::KilovoltAmpereReactive,
186 Unit::VoltAmpereReactiveHour,
187 Unit::KilovoltAmpereReactiveHour,
188 Unit::CubicMeter,
189 Unit::Piece,
190 Unit::Second,
191 Unit::Minute,
192 Unit::Hour,
193 Unit::QuarterHour,
194 Unit::Day,
195 Unit::Week,
196 Unit::Month,
197 Unit::Quarter,
198 Unit::HalfYear,
199 Unit::Year,
200 Unit::Percent,
201 Unit::KilowattHourPerKelvin,
202 ] {
203 let json = serde_json::to_string(&unit).unwrap();
204 let parsed: Unit = serde_json::from_str(&json).unwrap();
205 assert_eq!(unit, parsed);
206 }
207 }
208}