bo4e_core/enums/
eco_label.rs

1//! Eco label (Oekolabel) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Eco label for green electricity and gas.
6///
7/// Enumeration of labels for eco-electricity from various issuers.
8///
9/// German: Oekolabel
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum EcoLabel {
13    /// Energreen label
14    #[serde(rename = "ENERGREEN")]
15    Energreen,
16
17    /// Gasgreen + Gruener Strom combined label
18    #[serde(rename = "GASGREEN_GRUENER_STROM")]
19    GasgreenGruenerStrom,
20
21    /// Gasgreen label
22    #[serde(rename = "GASGREEN")]
23    Gasgreen,
24
25    /// Gruener Strom Gold label
26    #[serde(rename = "GRUENER_STROM_GOLD")]
27    GruenerStromGold,
28
29    /// Gruener Strom Silver label
30    #[serde(rename = "GRUENER_STROM_SILBER")]
31    GruenerStromSilber,
32
33    /// Gruener Strom label
34    #[serde(rename = "GRUENER_STROM")]
35    GruenerStrom,
36
37    /// Gruenes Gas label
38    #[serde(rename = "GRUENES_GAS")]
39    GruenesGas,
40
41    /// Naturwatt Strom label
42    #[serde(rename = "NATURWATT_STROM")]
43    NaturwattStrom,
44
45    /// ok-power label
46    #[serde(rename = "OK_POWER")]
47    OkPower,
48
49    /// RenewablePLUS label
50    #[serde(rename = "RENEWABLE_PLUS")]
51    RenewablePlus,
52
53    /// Watergreen label
54    #[serde(rename = "WATERGREEN")]
55    Watergreen,
56
57    /// Watergreen Plus label
58    #[serde(rename = "WATERGREEN_PLUS")]
59    WatergreenPlus,
60}
61
62impl EcoLabel {
63    /// Returns the German name.
64    pub fn german_name(&self) -> &'static str {
65        match self {
66            Self::Energreen => "Energreen",
67            Self::GasgreenGruenerStrom => "Gasgreen Grüner Strom",
68            Self::Gasgreen => "Gasgreen",
69            Self::GruenerStromGold => "Grüner Strom Gold",
70            Self::GruenerStromSilber => "Grüner Strom Silber",
71            Self::GruenerStrom => "Grüner Strom",
72            Self::GruenesGas => "Grünes Gas",
73            Self::NaturwattStrom => "Naturwatt Strom",
74            Self::OkPower => "ok-power",
75            Self::RenewablePlus => "RenewablePLUS",
76            Self::Watergreen => "Watergreen",
77            Self::WatergreenPlus => "Watergreen Plus",
78        }
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn test_serialize() {
88        assert_eq!(
89            serde_json::to_string(&EcoLabel::GruenerStromGold).unwrap(),
90            r#""GRUENER_STROM_GOLD""#
91        );
92        assert_eq!(
93            serde_json::to_string(&EcoLabel::OkPower).unwrap(),
94            r#""OK_POWER""#
95        );
96    }
97
98    #[test]
99    fn test_roundtrip() {
100        for label in [
101            EcoLabel::Energreen,
102            EcoLabel::GasgreenGruenerStrom,
103            EcoLabel::Gasgreen,
104            EcoLabel::GruenerStromGold,
105            EcoLabel::GruenerStromSilber,
106            EcoLabel::GruenerStrom,
107            EcoLabel::GruenesGas,
108            EcoLabel::NaturwattStrom,
109            EcoLabel::OkPower,
110            EcoLabel::RenewablePlus,
111            EcoLabel::Watergreen,
112            EcoLabel::WatergreenPlus,
113        ] {
114            let json = serde_json::to_string(&label).unwrap();
115            let parsed: EcoLabel = serde_json::from_str(&json).unwrap();
116            assert_eq!(label, parsed);
117        }
118    }
119}