bo4e_core/enums/
unit.rs

1//! Unit of measurement (Mengeneinheit) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Unit of measurement.
6///
7/// Measurement units that can be determined by measurement or specification.
8///
9/// German: Mengeneinheit
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum Unit {
13    // Power units
14    /// Watt
15    #[serde(rename = "W")]
16    Watt,
17
18    /// Kilowatt
19    #[serde(rename = "KW")]
20    Kilowatt,
21
22    /// Megawatt
23    #[serde(rename = "MW")]
24    Megawatt,
25
26    // Energy units
27    /// Watt hour
28    #[serde(rename = "WH")]
29    WattHour,
30
31    /// Kilowatt hour
32    #[serde(rename = "KWH")]
33    KilowattHour,
34
35    /// Megawatt hour
36    #[serde(rename = "MWH")]
37    MegawattHour,
38
39    // Reactive power units
40    /// Volt-ampere reactive
41    #[serde(rename = "VAR")]
42    VoltAmpereReactive,
43
44    /// Kilovolt-ampere reactive
45    #[serde(rename = "KVAR")]
46    KilovoltAmpereReactive,
47
48    /// Volt-ampere reactive hour
49    #[serde(rename = "VARH")]
50    VoltAmpereReactiveHour,
51
52    /// Kilovolt-ampere reactive hour
53    #[serde(rename = "KVARH")]
54    KilovoltAmpereReactiveHour,
55
56    // Volume units
57    /// Cubic meter (for gas)
58    #[serde(rename = "KUBIKMETER")]
59    CubicMeter,
60
61    // Count unit
62    /// Piece/unit count
63    #[serde(rename = "STUECK")]
64    Piece,
65
66    // Time units
67    /// Second
68    #[serde(rename = "SEKUNDE")]
69    Second,
70
71    /// Minute
72    #[serde(rename = "MINUTE")]
73    Minute,
74
75    /// Hour
76    #[serde(rename = "STUNDE")]
77    Hour,
78
79    /// Quarter hour
80    #[serde(rename = "VIERTEL_STUNDE")]
81    QuarterHour,
82
83    /// Day
84    #[serde(rename = "TAG")]
85    Day,
86
87    /// Week
88    #[serde(rename = "WOCHE")]
89    Week,
90
91    /// Month
92    #[serde(rename = "MONAT")]
93    Month,
94
95    /// Quarter (3 months)
96    #[serde(rename = "QUARTAL")]
97    Quarter,
98
99    /// Half year
100    #[serde(rename = "HALBJAHR")]
101    HalfYear,
102
103    /// Year
104    #[serde(rename = "JAHR")]
105    Year,
106
107    // Other units
108    /// Percent
109    #[serde(rename = "PROZENT")]
110    Percent,
111
112    /// Kilowatt hour per Kelvin
113    #[serde(rename = "KWHK")]
114    KilowattHourPerKelvin,
115}
116
117impl Unit {
118    /// Returns the German name.
119    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}