bo4e_core/enums/
measured_quantity.rs

1//! Measured quantity (Messgroesse) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Measured physical quantity.
6///
7/// Indicates the physical quantity that was measured.
8///
9/// German: Messgroesse
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum MeasuredQuantity {
13    /// Electric current (Strom)
14    #[serde(rename = "STROM")]
15    Current,
16
17    /// Voltage (Spannung)
18    #[serde(rename = "SPANNUNG")]
19    Voltage,
20
21    /// Active power (Wirkleistung)
22    #[serde(rename = "WIRKLEISTUNG")]
23    ActivePower,
24
25    /// Reactive power (Blindleistung)
26    #[serde(rename = "BLINDLEISTUNG")]
27    ReactivePower,
28
29    /// Pressure (Druck)
30    #[serde(rename = "DRUCK")]
31    Pressure,
32
33    /// Load profile (Lastgang)
34    #[serde(rename = "LASTGANG")]
35    LoadProfile,
36
37    /// Standard load profile (Lastprofil)
38    #[serde(rename = "LASTPROFIL")]
39    StandardLoadProfile,
40
41    /// Temperature (Temperatur)
42    #[serde(rename = "TEMPERATUR")]
43    Temperature,
44
45    /// State number (Zustandszahl)
46    #[serde(rename = "ZZAHL")]
47    StateNumber,
48
49    /// Calorific value (Brennwert)
50    #[serde(rename = "BRENNWERT")]
51    CalorificValue,
52
53    /// Degree days (Gradtagszahlen)
54    #[serde(rename = "GRADTZAGSZAHLEN")]
55    DegreeDays,
56
57    /// Volume flow (Volumenstrom)
58    #[serde(rename = "VOLUMENSTROM")]
59    VolumeFlow,
60
61    /// Prices (Preise)
62    #[serde(rename = "PREISE")]
63    Prices,
64}
65
66impl MeasuredQuantity {
67    /// Returns the German name.
68    pub fn german_name(&self) -> &'static str {
69        match self {
70            Self::Current => "Strom",
71            Self::Voltage => "Spannung",
72            Self::ActivePower => "Wirkleistung",
73            Self::ReactivePower => "Blindleistung",
74            Self::Pressure => "Druck",
75            Self::LoadProfile => "Lastgang",
76            Self::StandardLoadProfile => "Lastprofil",
77            Self::Temperature => "Temperatur",
78            Self::StateNumber => "Zustandszahl",
79            Self::CalorificValue => "Brennwert",
80            Self::DegreeDays => "Gradtagszahlen",
81            Self::VolumeFlow => "Volumenstrom",
82            Self::Prices => "Preise",
83        }
84    }
85}
86
87#[cfg(test)]
88mod tests {
89    use super::*;
90
91    #[test]
92    fn test_serialize() {
93        assert_eq!(
94            serde_json::to_string(&MeasuredQuantity::Voltage).unwrap(),
95            r#""SPANNUNG""#
96        );
97    }
98
99    #[test]
100    fn test_roundtrip() {
101        for quantity in [
102            MeasuredQuantity::Current,
103            MeasuredQuantity::Voltage,
104            MeasuredQuantity::ActivePower,
105            MeasuredQuantity::ReactivePower,
106            MeasuredQuantity::Pressure,
107            MeasuredQuantity::LoadProfile,
108            MeasuredQuantity::StandardLoadProfile,
109            MeasuredQuantity::Temperature,
110            MeasuredQuantity::StateNumber,
111            MeasuredQuantity::CalorificValue,
112            MeasuredQuantity::DegreeDays,
113            MeasuredQuantity::VolumeFlow,
114            MeasuredQuantity::Prices,
115        ] {
116            let json = serde_json::to_string(&quantity).unwrap();
117            let parsed: MeasuredQuantity = serde_json::from_str(&json).unwrap();
118            assert_eq!(quantity, parsed);
119        }
120    }
121}