Skip to main content

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