Skip to main content

bo4e_core/enums/
market_role.rs

1//! Market role (Marktrolle) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Role of a market participant in the energy market.
6///
7/// German: Marktrolle
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
10#[cfg_attr(feature = "json-schema", schemars(rename = "Marktrolle"))]
11#[non_exhaustive]
12pub enum MarketRole {
13    /// Technical resource operator (Betreiber einer technischen Ressource)
14    #[serde(rename = "BTR")]
15    TechnicalResourceOperator,
16
17    /// Balance coordinator / market area manager (Bilanzkoordinator / Marktgebietsverantwortlicher)
18    #[serde(rename = "BIKO")]
19    BalanceCoordinator,
20
21    /// Balance responsible party (Bilanzkreisverantwortlicher)
22    #[serde(rename = "BKV")]
23    BalanceResponsibleParty,
24
25    /// Data provider
26    #[serde(rename = "DP")]
27    DataProvider,
28
29    /// Deployment responsible (Einsatzverantwortlicher)
30    #[serde(rename = "EIV")]
31    DeploymentResponsible,
32
33    /// Energy service provider of connection user (Energieserviceanbieter des Anschlussnutzers)
34    #[serde(rename = "ESA")]
35    EnergyServiceProvider,
36
37    /// Capacity user (Kapazitaetsnutzer)
38    #[serde(rename = "KN")]
39    CapacityUser,
40
41    /// Supplier (Lieferant)
42    #[serde(rename = "LF")]
43    Supplier,
44
45    /// Market area manager (Marktgebietsverantwortlicher)
46    #[serde(rename = "MGV")]
47    MarketAreaManager,
48
49    /// Metering point operator (Messstellenbetreiber)
50    #[serde(rename = "MSB")]
51    MeteringPointOperator,
52
53    /// Network operator (Netzbetreiber)
54    #[serde(rename = "NB")]
55    NetworkOperator,
56
57    /// Register operator (Registerbetreiber)
58    #[serde(rename = "RB")]
59    RegisterOperator,
60
61    /// Transmission system operator (Uebertragungsnetzbetreiber)
62    #[serde(rename = "UENB")]
63    TransmissionSystemOperator,
64}
65
66impl MarketRole {
67    /// Returns the German name.
68    pub fn german_name(&self) -> &'static str {
69        match self {
70            Self::TechnicalResourceOperator => "Betreiber einer technischen Ressource",
71            Self::BalanceCoordinator => "Bilanzkoordinator",
72            Self::BalanceResponsibleParty => "Bilanzkreisverantwortlicher",
73            Self::DataProvider => "Data Provider",
74            Self::DeploymentResponsible => "Einsatzverantwortlicher",
75            Self::EnergyServiceProvider => "Energieserviceanbieter des Anschlussnutzers",
76            Self::CapacityUser => "Kapazitaetsnutzer",
77            Self::Supplier => "Lieferant",
78            Self::MarketAreaManager => "Marktgebietsverantwortlicher",
79            Self::MeteringPointOperator => "Messstellenbetreiber",
80            Self::NetworkOperator => "Netzbetreiber",
81            Self::RegisterOperator => "Registerbetreiber",
82            Self::TransmissionSystemOperator => "Uebertragungsnetzbetreiber",
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(&MarketRole::NetworkOperator).unwrap(),
95            r#""NB""#
96        );
97        assert_eq!(
98            serde_json::to_string(&MarketRole::Supplier).unwrap(),
99            r#""LF""#
100        );
101    }
102
103    #[test]
104    fn test_deserialize() {
105        assert_eq!(
106            serde_json::from_str::<MarketRole>(r#""MSB""#).unwrap(),
107            MarketRole::MeteringPointOperator
108        );
109        assert_eq!(
110            serde_json::from_str::<MarketRole>(r#""BKV""#).unwrap(),
111            MarketRole::BalanceResponsibleParty
112        );
113    }
114
115    #[test]
116    fn test_roundtrip() {
117        for role in [
118            MarketRole::TechnicalResourceOperator,
119            MarketRole::BalanceCoordinator,
120            MarketRole::BalanceResponsibleParty,
121            MarketRole::DataProvider,
122            MarketRole::DeploymentResponsible,
123            MarketRole::EnergyServiceProvider,
124            MarketRole::CapacityUser,
125            MarketRole::Supplier,
126            MarketRole::MarketAreaManager,
127            MarketRole::MeteringPointOperator,
128            MarketRole::NetworkOperator,
129            MarketRole::RegisterOperator,
130            MarketRole::TransmissionSystemOperator,
131        ] {
132            let json = serde_json::to_string(&role).unwrap();
133            let parsed: MarketRole = serde_json::from_str(&json).unwrap();
134            assert_eq!(role, parsed);
135        }
136    }
137}