Skip to main content

bo4e_core/enums/
network_level.rs

1//! Network level (Netzebene) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Network level within electricity and gas energy types.
6///
7/// Lists possible network levels for electricity (voltage levels) and gas (pressure levels).
8///
9/// German: Netzebene
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 = "Netzebene"))]
13#[non_exhaustive]
14pub enum NetworkLevel {
15    // Electricity levels
16    /// Low voltage (Niederspannung) - Electricity
17    #[serde(rename = "NSP")]
18    LowVoltage,
19
20    /// Medium voltage (Mittelspannung) - Electricity
21    #[serde(rename = "MSP")]
22    MediumVoltage,
23
24    /// High voltage (Hochspannung) - Electricity
25    #[serde(rename = "HSP")]
26    HighVoltage,
27
28    /// Extra high voltage (Höchstspannung) - Electricity
29    #[serde(rename = "HSS")]
30    ExtraHighVoltage,
31
32    /// Medium to low voltage transformation (MS/NS Umspannung) - Electricity
33    #[serde(rename = "MSP_NSP_UMSP")]
34    MediumLowVoltageTransformation,
35
36    /// High to medium voltage transformation (HS/MS Umspannung) - Electricity
37    #[serde(rename = "HSP_MSP_UMSP")]
38    HighMediumVoltageTransformation,
39
40    /// Extra high to high voltage transformation (HöS/HS Umspannung) - Electricity
41    #[serde(rename = "HSS_HSP_UMSP")]
42    ExtraHighHighVoltageTransformation,
43
44    // Gas levels
45    /// High pressure (Hochdruck) - Gas
46    #[serde(rename = "HD")]
47    HighPressure,
48
49    /// Medium pressure (Mitteldruck) - Gas
50    #[serde(rename = "MD")]
51    MediumPressure,
52
53    /// Low pressure (Niederdruck) - Gas
54    #[serde(rename = "ND")]
55    LowPressure,
56}
57
58impl NetworkLevel {
59    /// Returns the German name.
60    pub fn german_name(&self) -> &'static str {
61        match self {
62            Self::LowVoltage => "Niederspannung",
63            Self::MediumVoltage => "Mittelspannung",
64            Self::HighVoltage => "Hochspannung",
65            Self::ExtraHighVoltage => "Höchstspannung",
66            Self::MediumLowVoltageTransformation => "MS/NS Umspannung",
67            Self::HighMediumVoltageTransformation => "HS/MS Umspannung",
68            Self::ExtraHighHighVoltageTransformation => "HöS/HS Umspannung",
69            Self::HighPressure => "Hochdruck",
70            Self::MediumPressure => "Mitteldruck",
71            Self::LowPressure => "Niederdruck",
72        }
73    }
74
75    /// Returns true if this is an electricity network level.
76    pub fn is_electricity(&self) -> bool {
77        matches!(
78            self,
79            Self::LowVoltage
80                | Self::MediumVoltage
81                | Self::HighVoltage
82                | Self::ExtraHighVoltage
83                | Self::MediumLowVoltageTransformation
84                | Self::HighMediumVoltageTransformation
85                | Self::ExtraHighHighVoltageTransformation
86        )
87    }
88
89    /// Returns true if this is a gas network level.
90    pub fn is_gas(&self) -> bool {
91        matches!(
92            self,
93            Self::HighPressure | Self::MediumPressure | Self::LowPressure
94        )
95    }
96}
97
98#[cfg(test)]
99mod tests {
100    use super::*;
101
102    #[test]
103    fn test_serialize() {
104        assert_eq!(
105            serde_json::to_string(&NetworkLevel::LowVoltage).unwrap(),
106            r#""NSP""#
107        );
108        assert_eq!(
109            serde_json::to_string(&NetworkLevel::HighPressure).unwrap(),
110            r#""HD""#
111        );
112    }
113
114    #[test]
115    fn test_roundtrip() {
116        for level in [
117            NetworkLevel::LowVoltage,
118            NetworkLevel::MediumVoltage,
119            NetworkLevel::HighVoltage,
120            NetworkLevel::ExtraHighVoltage,
121            NetworkLevel::MediumLowVoltageTransformation,
122            NetworkLevel::HighMediumVoltageTransformation,
123            NetworkLevel::ExtraHighHighVoltageTransformation,
124            NetworkLevel::HighPressure,
125            NetworkLevel::MediumPressure,
126            NetworkLevel::LowPressure,
127        ] {
128            let json = serde_json::to_string(&level).unwrap();
129            let parsed: NetworkLevel = serde_json::from_str(&json).unwrap();
130            assert_eq!(level, parsed);
131        }
132    }
133
134    #[test]
135    fn test_is_electricity() {
136        assert!(NetworkLevel::LowVoltage.is_electricity());
137        assert!(NetworkLevel::HighVoltage.is_electricity());
138        assert!(!NetworkLevel::HighPressure.is_electricity());
139    }
140
141    #[test]
142    fn test_is_gas() {
143        assert!(NetworkLevel::HighPressure.is_gas());
144        assert!(NetworkLevel::LowPressure.is_gas());
145        assert!(!NetworkLevel::LowVoltage.is_gas());
146    }
147}