Skip to main content

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