bo4e_core/com/
quality_indicator.rs1use serde::{Deserialize, Serialize};
4
5use crate::enums::MeasuredValueStatus;
6use crate::traits::{Bo4eMeta, Bo4eObject};
7
8#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct QualityIndicator {
27 #[serde(flatten)]
29 pub meta: Bo4eMeta,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub quality_code: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub status: Option<MeasuredValueStatus>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub quality_description: Option<String>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub confidence_percent: Option<f64>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub data_source: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub is_substituted: Option<bool>,
54}
55
56impl Bo4eObject for QualityIndicator {
57 fn type_name_german() -> &'static str {
58 "Qualitaetsindikator"
59 }
60
61 fn type_name_english() -> &'static str {
62 "QualityIndicator"
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_quality_indicator() {
80 let indicator = QualityIndicator {
81 quality_code: Some("G1".to_string()),
82 status: Some(MeasuredValueStatus::Read),
83 confidence_percent: Some(99.5),
84 is_substituted: Some(false),
85 ..Default::default()
86 };
87
88 let json = serde_json::to_string(&indicator).unwrap();
89 assert!(json.contains("G1"));
90 assert!(json.contains("99.5"));
91 }
92
93 #[test]
94 fn test_substituted_value() {
95 let indicator = QualityIndicator {
96 status: Some(MeasuredValueStatus::Substitute),
97 is_substituted: Some(true),
98 data_source: Some("INTERPOLATION".to_string()),
99 ..Default::default()
100 };
101
102 let json = serde_json::to_string(&indicator).unwrap();
103 assert!(json.contains("INTERPOLATION"));
104 }
105
106 #[test]
107 fn test_roundtrip() {
108 let indicator = QualityIndicator {
109 quality_code: Some("G2".to_string()),
110 status: Some(MeasuredValueStatus::Forecast),
111 ..Default::default()
112 };
113
114 let json = serde_json::to_string(&indicator).unwrap();
115 let parsed: QualityIndicator = serde_json::from_str(&json).unwrap();
116 assert_eq!(indicator, parsed);
117 }
118
119 #[test]
120 fn test_bo4e_object_impl() {
121 assert_eq!(QualityIndicator::type_name_german(), "Qualitaetsindikator");
122 assert_eq!(QualityIndicator::type_name_english(), "QualityIndicator");
123 }
124}