Skip to main content

cimstructs/
Command.rs

1/// A Command is a discrete control used for supervisory control.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct Command {
4    #[serde(flatten)]
5    pub base: super::Control,
6    /// The MeasurementValue that is controlled.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub discrete_value: Option<super::base::MridRef>,
9    /// The ValueAliasSet used for translation of a Control value to a name.
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub value_alias_set: Option<super::base::MridRef>,
12    /// Normal value for Control.value e.g. used for percentage scaling.
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub normal_value: Option<i64>,
15    /// The value representing the actuator output.
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub value: Option<i64>,
18}
19impl crate::base::CimElement for Command {
20    fn mrid(&self) -> &str { &self.base.base.base.id }
21    fn type_name(&self) -> &'static str { "Command" }
22    fn as_any(&self) -> &dyn std::any::Any { self }
23    fn to_json_value(&self) -> serde_json::Value {
24        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
25    }
26    fn to_block(&self) -> crate::base::RdfBlock {
27        let mut block = self.base.to_block();
28        block.type_name = "Command".to_string();
29        if let Some(ref v) = self.discrete_value {
30            block.fields.insert("Command.DiscreteValue".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
31        }
32        if let Some(ref v) = self.value_alias_set {
33            block.fields.insert("Command.ValueAliasSet".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
34        }
35        if let Some(v) = self.normal_value {
36            block.fields.insert("Command.normalValue".into(), crate::base::FieldValue::Text(v.to_string()));
37        }
38        if let Some(v) = self.value {
39            block.fields.insert("Command.value".into(), crate::base::FieldValue::Text(v.to_string()));
40        }
41        block
42    }
43}
44
45impl Command {
46    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
47        let mut obj = Self::default();
48        obj.base.base.base.id.clone_from(&b.mrid);
49        for (key, val) in &b.fields {
50            match key.as_str() {
51                "Command.DiscreteValue" => {
52                    if let crate::base::FieldValue::Resource(sv) = val {
53                        obj.discrete_value = Some(crate::base::MridRef { mrid: sv.clone() });
54                    }
55                }
56                "Command.ValueAliasSet" => {
57                    if let crate::base::FieldValue::Resource(sv) = val {
58                        obj.value_alias_set = Some(crate::base::MridRef { mrid: sv.clone() });
59                    }
60                }
61                "Command.normalValue" => {
62                    match val {
63                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.normal_value = Some(v); } }
64                        crate::base::FieldValue::TextList(svs) => {
65                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.normal_value = Some(v); } }
66                        }
67                        _ => {}
68                    }
69                }
70                "Command.value" => {
71                    match val {
72                        crate::base::FieldValue::Text(sv) => { if let Ok(v) = sv.trim().parse() { obj.value = Some(v); } }
73                        crate::base::FieldValue::TextList(svs) => {
74                            if let Some(sv) = svs.last() { if let Ok(v) = sv.trim().parse() { obj.value = Some(v); } }
75                        }
76                        _ => {}
77                    }
78                }
79                "Control.PowerSystemResource" => {
80                    if let crate::base::FieldValue::Resource(sv) = val {
81                        obj.base.power_system_resource = Some(crate::base::MridRef { mrid: sv.clone() });
82                    }
83                }
84                "Control.controlType" => {
85                    match val {
86                        crate::base::FieldValue::Text(sv) => { obj.base.control_type = sv.clone(); }
87                        crate::base::FieldValue::TextList(svs) => {
88                            if let Some(sv) = svs.last() { obj.base.control_type = sv.clone(); }
89                        }
90                        _ => {}
91                    }
92                }
93                "Control.operationInProgress" => {
94                    match val {
95                        crate::base::FieldValue::Text(sv) => { obj.base.operation_in_progress = Some(sv.trim() == "true"); }
96                        crate::base::FieldValue::TextList(svs) => {
97                            if let Some(sv) = svs.last() { obj.base.operation_in_progress = Some(sv.trim() == "true"); }
98                        }
99                        _ => {}
100                    }
101                }
102                "Control.timeStamp" => {
103                    match val {
104                        crate::base::FieldValue::Text(sv) => { obj.base.time_stamp = sv.clone(); }
105                        crate::base::FieldValue::TextList(svs) => {
106                            if let Some(sv) = svs.last() { obj.base.time_stamp = sv.clone(); }
107                        }
108                        _ => {}
109                    }
110                }
111                "Control.unitMultiplier" => {
112                    if let crate::base::FieldValue::Resource(sv) = val {
113                        obj.base.unit_multiplier = Some(crate::base::UriRef { uri: sv.clone() });
114                    }
115                }
116                "Control.unitSymbol" => {
117                    if let crate::base::FieldValue::Resource(sv) = val {
118                        obj.base.unit_symbol = Some(crate::base::UriRef { uri: sv.clone() });
119                    }
120                }
121                "IdentifiedObject.description" => {
122                    match val {
123                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.description = sv.clone(); }
124                        crate::base::FieldValue::TextList(svs) => {
125                            if let Some(sv) = svs.last() { obj.base.base.base.description = sv.clone(); }
126                        }
127                        _ => {}
128                    }
129                }
130                "IdentifiedObject.energyIdentCodeEic" => {
131                    match val {
132                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
133                        crate::base::FieldValue::TextList(svs) => {
134                            if let Some(sv) = svs.last() { obj.base.base.base.energy_ident_code_eic = sv.clone(); }
135                        }
136                        _ => {}
137                    }
138                }
139                "IdentifiedObject.mRID" => {
140                    match val {
141                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.m_rid = sv.clone(); }
142                        crate::base::FieldValue::TextList(svs) => {
143                            if let Some(sv) = svs.last() { obj.base.base.base.m_rid = sv.clone(); }
144                        }
145                        _ => {}
146                    }
147                }
148                "IdentifiedObject.name" => {
149                    match val {
150                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.name = sv.clone(); }
151                        crate::base::FieldValue::TextList(svs) => {
152                            if let Some(sv) = svs.last() { obj.base.base.base.name = sv.clone(); }
153                        }
154                        _ => {}
155                    }
156                }
157                "IdentifiedObject.shortName" => {
158                    match val {
159                        crate::base::FieldValue::Text(sv) => { obj.base.base.base.short_name = sv.clone(); }
160                        crate::base::FieldValue::TextList(svs) => {
161                            if let Some(sv) = svs.last() { obj.base.base.base.short_name = sv.clone(); }
162                        }
163                        _ => {}
164                    }
165                }
166                _ => {}
167            }
168        }
169        obj
170    }
171}