bo4e_core/com/
surcharge_per_location.rs1use serde::{Deserialize, Serialize};
4
5use crate::traits::{Bo4eMeta, Bo4eObject};
6
7use super::Surcharge;
8
9#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct SurchargePerLocation {
27 #[serde(flatten)]
29 pub meta: Bo4eMeta,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub postal_code: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub municipality: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub network_area_code: Option<String>,
42
43 #[serde(default, skip_serializing_if = "Vec::is_empty")]
45 pub surcharges: Vec<Surcharge>,
46}
47
48impl Bo4eObject for SurchargePerLocation {
49 fn type_name_german() -> &'static str {
50 "AufAbschlagProOrt"
51 }
52
53 fn type_name_english() -> &'static str {
54 "SurchargePerLocation"
55 }
56
57 fn meta(&self) -> &Bo4eMeta {
58 &self.meta
59 }
60
61 fn meta_mut(&mut self) -> &mut Bo4eMeta {
62 &mut self.meta
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69
70 #[test]
71 fn test_location_surcharge() {
72 let surcharge = SurchargePerLocation {
73 postal_code: Some("50667".to_string()),
74 municipality: Some("Köln".to_string()),
75 surcharges: vec![Surcharge {
76 description: Some("Konzessionsabgabe".to_string()),
77 value: Some(1.59),
78 ..Default::default()
79 }],
80 ..Default::default()
81 };
82
83 assert_eq!(surcharge.postal_code, Some("50667".to_string()));
84 assert_eq!(surcharge.surcharges.len(), 1);
85 }
86
87 #[test]
88 fn test_default() {
89 let surcharge = SurchargePerLocation::default();
90 assert!(surcharge.postal_code.is_none());
91 assert!(surcharge.surcharges.is_empty());
92 }
93
94 #[test]
95 fn test_roundtrip() {
96 let surcharge = SurchargePerLocation {
97 postal_code: Some("80331".to_string()),
98 municipality: Some("München".to_string()),
99 network_area_code: Some("9900001".to_string()),
100 ..Default::default()
101 };
102
103 let json = serde_json::to_string(&surcharge).unwrap();
104 let parsed: SurchargePerLocation = serde_json::from_str(&json).unwrap();
105 assert_eq!(surcharge, parsed);
106 }
107
108 #[test]
109 fn test_bo4e_object_impl() {
110 assert_eq!(
111 SurchargePerLocation::type_name_german(),
112 "AufAbschlagProOrt"
113 );
114 assert_eq!(
115 SurchargePerLocation::type_name_english(),
116 "SurchargePerLocation"
117 );
118 }
119}