bo4e_core/com/
network_charge.rs1use serde::{Deserialize, Serialize};
4
5use crate::enums::{Currency, PriceType, Unit};
6use crate::traits::{Bo4eMeta, Bo4eObject};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct NetworkCharge {
27 #[serde(flatten)]
29 pub meta: Bo4eMeta,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub price_type: Option<PriceType>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub value: Option<f64>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub currency: Option<Currency>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub reference_unit: Option<Unit>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub description: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub network_operator_code: Option<String>,
54}
55
56impl Bo4eObject for NetworkCharge {
57 fn type_name_german() -> &'static str {
58 "Netzentgelt"
59 }
60
61 fn type_name_english() -> &'static str {
62 "NetworkCharge"
63 }
64
65 fn meta(&self) -> &Bo4eMeta {
66 &self.meta
67 }
68
69 fn meta_mut(&mut self) -> &mut Bo4eMeta {
70 &mut self.meta
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_work_price_charge() {
80 let charge = NetworkCharge {
81 price_type: Some(PriceType::WorkingPriceSingleTariff),
82 value: Some(5.82),
83 currency: Some(Currency::Eur),
84 reference_unit: Some(Unit::KilowattHour),
85 ..Default::default()
86 };
87
88 assert_eq!(charge.price_type, Some(PriceType::WorkingPriceSingleTariff));
89 assert_eq!(charge.value, Some(5.82));
90 }
91
92 #[test]
93 fn test_base_price_charge() {
94 let charge = NetworkCharge {
95 price_type: Some(PriceType::BasePrice),
96 value: Some(55.0),
97 currency: Some(Currency::Eur),
98 reference_unit: Some(Unit::Year),
99 network_operator_code: Some("9900001".to_string()),
100 ..Default::default()
101 };
102
103 assert_eq!(charge.price_type, Some(PriceType::BasePrice));
104 }
105
106 #[test]
107 fn test_default() {
108 let charge = NetworkCharge::default();
109 assert!(charge.price_type.is_none());
110 assert!(charge.value.is_none());
111 }
112
113 #[test]
114 fn test_roundtrip() {
115 let charge = NetworkCharge {
116 price_type: Some(PriceType::WorkingPriceSingleTariff),
117 value: Some(6.25),
118 currency: Some(Currency::Eur),
119 reference_unit: Some(Unit::KilowattHour),
120 description: Some("Arbeitspreis Netznutzung".to_string()),
121 ..Default::default()
122 };
123
124 let json = serde_json::to_string(&charge).unwrap();
125 let parsed: NetworkCharge = serde_json::from_str(&json).unwrap();
126 assert_eq!(charge, parsed);
127 }
128
129 #[test]
130 fn test_bo4e_object_impl() {
131 assert_eq!(NetworkCharge::type_name_german(), "Netzentgelt");
132 assert_eq!(NetworkCharge::type_name_english(), "NetworkCharge");
133 }
134}