bo4e_core/com/
meter_register.rs1use serde::{Deserialize, Serialize};
4
5use crate::enums::{EnergyDirection, RegisterType, Unit};
6use crate::traits::{Bo4eMeta, Bo4eObject};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
26#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
27#[cfg_attr(feature = "json-schema", schemars(rename = "Zaehlwerk"))]
28#[serde(rename_all = "camelCase")]
29pub struct MeterRegister {
30 #[serde(flatten)]
32 pub meta: Bo4eMeta,
33
34 #[serde(skip_serializing_if = "Option::is_none")]
36 #[cfg_attr(feature = "json-schema", schemars(rename = "zaehlwerkskennung"))]
37 pub register_id: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 #[cfg_attr(feature = "json-schema", schemars(rename = "obisKennzahl"))]
42 pub obis_code: Option<String>,
43
44 #[serde(skip_serializing_if = "Option::is_none")]
46 #[cfg_attr(feature = "json-schema", schemars(rename = "registerart"))]
47 pub register_type: Option<RegisterType>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 #[cfg_attr(feature = "json-schema", schemars(rename = "energierichtung"))]
52 pub energy_direction: Option<EnergyDirection>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
56 #[cfg_attr(feature = "json-schema", schemars(rename = "einheit"))]
57 pub unit: Option<Unit>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
61 #[cfg_attr(feature = "json-schema", schemars(rename = "nachkommastellen"))]
62 pub decimal_places: Option<i32>,
63
64 #[serde(skip_serializing_if = "Option::is_none")]
66 #[cfg_attr(feature = "json-schema", schemars(rename = "wandlerfaktor"))]
67 pub transformer_ratio: Option<f64>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 #[cfg_attr(feature = "json-schema", schemars(rename = "bezeichnung"))]
72 pub description: Option<String>,
73}
74
75impl Bo4eObject for MeterRegister {
76 fn type_name_german() -> &'static str {
77 "Zaehlwerk"
78 }
79
80 fn type_name_english() -> &'static str {
81 "MeterRegister"
82 }
83
84 fn meta(&self) -> &Bo4eMeta {
85 &self.meta
86 }
87
88 fn meta_mut(&mut self) -> &mut Bo4eMeta {
89 &mut self.meta
90 }
91}
92
93#[cfg(test)]
94mod tests {
95 use super::*;
96
97 #[test]
98 fn test_electricity_register() {
99 let register = MeterRegister {
100 obis_code: Some("1-0:1.8.0".to_string()),
101 energy_direction: Some(EnergyDirection::FeedOut),
102 unit: Some(Unit::KilowattHour),
103 description: Some("Bezug".to_string()),
104 ..Default::default()
105 };
106
107 let json = serde_json::to_string(®ister).unwrap();
108 assert!(json.contains("1-0:1.8.0"));
109 }
110
111 #[test]
112 fn test_roundtrip() {
113 let register = MeterRegister {
114 obis_code: Some("1-0:2.8.0".to_string()),
115 energy_direction: Some(EnergyDirection::FeedIn),
116 unit: Some(Unit::KilowattHour),
117 ..Default::default()
118 };
119
120 let json = serde_json::to_string(®ister).unwrap();
121 let parsed: MeterRegister = serde_json::from_str(&json).unwrap();
122 assert_eq!(register, parsed);
123 }
124
125 #[test]
126 fn test_bo4e_object_impl() {
127 assert_eq!(MeterRegister::type_name_german(), "Zaehlwerk");
128 assert_eq!(MeterRegister::type_name_english(), "MeterRegister");
129 }
130}