bo4e_core/com/
energy_source.rs1use serde::{Deserialize, Serialize};
4
5use crate::enums::GenerationType;
6use crate::traits::{Bo4eMeta, Bo4eObject};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct EnergySource {
27 #[serde(flatten)]
29 pub meta: Bo4eMeta,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub generation_type: Option<GenerationType>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub percentage_share: Option<f64>,
38}
39
40impl Bo4eObject for EnergySource {
41 fn type_name_german() -> &'static str {
42 "Energieherkunft"
43 }
44
45 fn type_name_english() -> &'static str {
46 "EnergySource"
47 }
48
49 fn meta(&self) -> &Bo4eMeta {
50 &self.meta
51 }
52
53 fn meta_mut(&mut self) -> &mut Bo4eMeta {
54 &mut self.meta
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn test_solar_source() {
64 let source = EnergySource {
65 generation_type: Some(GenerationType::Solar),
66 percentage_share: Some(35.0),
67 ..Default::default()
68 };
69
70 assert_eq!(source.generation_type, Some(GenerationType::Solar));
71 assert_eq!(source.percentage_share, Some(35.0));
72 }
73
74 #[test]
75 fn test_wind_source() {
76 let source = EnergySource {
77 generation_type: Some(GenerationType::Wind),
78 percentage_share: Some(45.0),
79 ..Default::default()
80 };
81
82 assert_eq!(source.generation_type, Some(GenerationType::Wind));
83 }
84
85 #[test]
86 fn test_default() {
87 let source = EnergySource::default();
88 assert!(source.generation_type.is_none());
89 assert!(source.percentage_share.is_none());
90 }
91
92 #[test]
93 fn test_serialize() {
94 let source = EnergySource {
95 generation_type: Some(GenerationType::Solar),
96 percentage_share: Some(25.5),
97 ..Default::default()
98 };
99
100 let json = serde_json::to_string(&source).unwrap();
101 assert!(json.contains(r#""generationType":"SOLAR""#));
102 assert!(json.contains(r#""percentageShare":25.5"#));
103 }
104
105 #[test]
106 fn test_roundtrip() {
107 let source = EnergySource {
108 generation_type: Some(GenerationType::Wind),
109 percentage_share: Some(60.0),
110 ..Default::default()
111 };
112
113 let json = serde_json::to_string(&source).unwrap();
114 let parsed: EnergySource = serde_json::from_str(&json).unwrap();
115 assert_eq!(source, parsed);
116 }
117
118 #[test]
119 fn test_bo4e_object_impl() {
120 assert_eq!(EnergySource::type_name_german(), "Energieherkunft");
121 assert_eq!(EnergySource::type_name_english(), "EnergySource");
122 }
123}