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