1use serde::{Deserialize, Serialize};
4
5use crate::enums::{Currency, Unit};
6use crate::traits::{Bo4eMeta, Bo4eObject};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct Levy {
26 #[serde(flatten)]
28 pub meta: Bo4eMeta,
29
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub description: Option<String>,
33
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub value: Option<f64>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub currency: Option<Currency>,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub reference_unit: Option<Unit>,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub legal_reference: Option<String>,
49
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub website: Option<String>,
53}
54
55impl Bo4eObject for Levy {
56 fn type_name_german() -> &'static str {
57 "Umlage"
58 }
59
60 fn type_name_english() -> &'static str {
61 "Levy"
62 }
63
64 fn meta(&self) -> &Bo4eMeta {
65 &self.meta
66 }
67
68 fn meta_mut(&mut self) -> &mut Bo4eMeta {
69 &mut self.meta
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn test_eeg_levy() {
79 let levy = Levy {
80 description: Some("EEG-Umlage".to_string()),
81 value: Some(6.756),
82 currency: Some(Currency::Eur),
83 reference_unit: Some(Unit::KilowattHour),
84 legal_reference: Some("§ 60 EEG".to_string()),
85 ..Default::default()
86 };
87
88 assert_eq!(levy.description, Some("EEG-Umlage".to_string()));
89 assert_eq!(levy.value, Some(6.756));
90 }
91
92 #[test]
93 fn test_kwk_levy() {
94 let levy = Levy {
95 description: Some("KWK-Umlage".to_string()),
96 value: Some(0.254),
97 currency: Some(Currency::Eur),
98 reference_unit: Some(Unit::KilowattHour),
99 ..Default::default()
100 };
101
102 assert_eq!(levy.description, Some("KWK-Umlage".to_string()));
103 }
104
105 #[test]
106 fn test_default() {
107 let levy = Levy::default();
108 assert!(levy.description.is_none());
109 assert!(levy.value.is_none());
110 }
111
112 #[test]
113 fn test_roundtrip() {
114 let levy = Levy {
115 description: Some("§19 StromNEV-Umlage".to_string()),
116 value: Some(0.437),
117 currency: Some(Currency::Eur),
118 reference_unit: Some(Unit::KilowattHour),
119 legal_reference: Some("§ 19 StromNEV".to_string()),
120 website: Some("https://www.netztransparenz.de".to_string()),
121 ..Default::default()
122 };
123
124 let json = serde_json::to_string(&levy).unwrap();
125 let parsed: Levy = serde_json::from_str(&json).unwrap();
126 assert_eq!(levy, parsed);
127 }
128
129 #[test]
130 fn test_bo4e_object_impl() {
131 assert_eq!(Levy::type_name_german(), "Umlage");
132 assert_eq!(Levy::type_name_english(), "Levy");
133 }
134}