bo4e_core/bo/
metering_location.rs1use serde::{Deserialize, Serialize};
6
7use crate::com::{Address, GeoCoordinates, Hardware};
8use crate::enums::Division;
9use crate::traits::{Bo4eMeta, Bo4eObject};
10
11#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct MeteringLocation {
33 #[serde(flatten)]
35 pub meta: Bo4eMeta,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub metering_location_id: Option<String>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub division: Option<Division>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub address: Option<Address>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub coordinates: Option<GeoCoordinates>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub metering_operator_code: Option<String>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub network_operator_code: Option<String>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub grid_area: Option<String>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub description: Option<String>,
68
69 #[serde(default, skip_serializing_if = "Vec::is_empty")]
71 pub hardware: Vec<Hardware>,
72
73 #[serde(default, skip_serializing_if = "Vec::is_empty")]
75 pub meter_ids: Vec<String>,
76
77 #[serde(default, skip_serializing_if = "Vec::is_empty")]
79 pub market_location_ids: Vec<String>,
80}
81
82impl Bo4eObject for MeteringLocation {
83 fn type_name_german() -> &'static str {
84 "Messlokation"
85 }
86
87 fn type_name_english() -> &'static str {
88 "MeteringLocation"
89 }
90
91 fn meta(&self) -> &Bo4eMeta {
92 &self.meta
93 }
94
95 fn meta_mut(&mut self) -> &mut Bo4eMeta {
96 &mut self.meta
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use super::*;
103
104 #[test]
105 fn test_melo_creation() {
106 let melo = MeteringLocation {
107 metering_location_id: Some("DE00012345678901234567890123456789".to_string()),
108 division: Some(Division::Electricity),
109 ..Default::default()
110 };
111
112 assert!(melo.metering_location_id.is_some());
113 }
114
115 #[test]
116 fn test_serialize() {
117 let melo = MeteringLocation {
118 meta: Bo4eMeta::with_type("Messlokation"),
119 metering_location_id: Some("DE00012345678901234567890123456789".to_string()),
120 ..Default::default()
121 };
122
123 let json = serde_json::to_string(&melo).unwrap();
124 assert!(json.contains(r#""_typ":"Messlokation""#));
125 assert!(json.contains("DE00012345678901234567890123456789"));
126 }
127
128 #[test]
129 fn test_roundtrip() {
130 let melo = MeteringLocation {
131 meta: Bo4eMeta::with_type("Messlokation"),
132 metering_location_id: Some("DE00012345678901234567890123456789".to_string()),
133 division: Some(Division::Electricity),
134 metering_operator_code: Some("9900001234".to_string()),
135 meter_ids: vec!["METER001".to_string()],
136 ..Default::default()
137 };
138
139 let json = serde_json::to_string(&melo).unwrap();
140 let parsed: MeteringLocation = serde_json::from_str(&json).unwrap();
141 assert_eq!(melo, parsed);
142 }
143
144 #[test]
145 fn test_bo4e_object_impl() {
146 assert_eq!(MeteringLocation::type_name_german(), "Messlokation");
147 assert_eq!(MeteringLocation::type_name_english(), "MeteringLocation");
148 }
149}