Skip to main content

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