Skip to main content

cimstructs/
TopologicalIsland.rs

1/// An electrically connected subset of the network. Topological islands can change as the current network state changes, e.g. due to: - disconnect switches or breakers changing state in a SCADA/EMS. - manual creation, change or deletion of topological nodes in a planning tool. Only energised TopologicalNode-s shall be part of the topological island.
2#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
3pub struct TopologicalIsland {
4    #[serde(flatten)]
5    pub base: super::IdentifiedObject,
6    /// The angle reference for the island. Normally there is one TopologicalNode that is selected as the angle reference for each island. Other reference schemes exist, so the association is typically optional.
7    #[serde(skip_serializing_if = "Option::is_none")]
8    pub angle_ref_topological_node: Option<super::base::MridRef>,
9    /// A topological node belongs to a topological island.
10    pub topological_nodes: Vec<super::base::MridRef>,
11}
12impl crate::base::CimElement for TopologicalIsland {
13    fn mrid(&self) -> &str { &self.base.id }
14    fn type_name(&self) -> &'static str { "TopologicalIsland" }
15    fn as_any(&self) -> &dyn std::any::Any { self }
16    fn to_json_value(&self) -> serde_json::Value {
17        serde_json::to_value(self).unwrap_or(serde_json::Value::Null)
18    }
19    fn to_block(&self) -> crate::base::RdfBlock {
20        let mut block = self.base.to_block();
21        block.type_name = "TopologicalIsland".to_string();
22        if let Some(ref v) = self.angle_ref_topological_node {
23            block.fields.insert("TopologicalIsland.AngleRefTopologicalNode".into(), crate::base::FieldValue::Resource(v.mrid.clone()));
24        }
25        if !self.topological_nodes.is_empty() {
26            block.fields.insert("TopologicalIsland.TopologicalNodes".into(), crate::base::FieldValue::ResourceList(self.topological_nodes.iter().map(|r| r.mrid.clone()).collect()));
27        }
28        block
29    }
30}
31
32impl TopologicalIsland {
33    pub fn from_block(b: &crate::base::RdfBlock) -> Self {
34        let mut obj = Self::default();
35        obj.base.id.clone_from(&b.mrid);
36        for (key, val) in &b.fields {
37            match key.as_str() {
38                "TopologicalIsland.AngleRefTopologicalNode" => {
39                    if let crate::base::FieldValue::Resource(sv) = val {
40                        obj.angle_ref_topological_node = Some(crate::base::MridRef { mrid: sv.clone() });
41                    }
42                }
43                "TopologicalIsland.TopologicalNodes" => {
44                    match val {
45                        crate::base::FieldValue::Resource(sv) => obj.topological_nodes.push(crate::base::MridRef { mrid: sv.clone() }),
46                        crate::base::FieldValue::ResourceList(svs) => {
47                            for sv in svs { obj.topological_nodes.push(crate::base::MridRef { mrid: sv.clone() }); }
48                        }
49                        _ => {}
50                    }
51                }
52                "IdentifiedObject.description" => {
53                    match val {
54                        crate::base::FieldValue::Text(sv) => { obj.base.description = sv.clone(); }
55                        crate::base::FieldValue::TextList(svs) => {
56                            if let Some(sv) = svs.last() { obj.base.description = sv.clone(); }
57                        }
58                        _ => {}
59                    }
60                }
61                "IdentifiedObject.energyIdentCodeEic" => {
62                    match val {
63                        crate::base::FieldValue::Text(sv) => { obj.base.energy_ident_code_eic = sv.clone(); }
64                        crate::base::FieldValue::TextList(svs) => {
65                            if let Some(sv) = svs.last() { obj.base.energy_ident_code_eic = sv.clone(); }
66                        }
67                        _ => {}
68                    }
69                }
70                "IdentifiedObject.mRID" => {
71                    match val {
72                        crate::base::FieldValue::Text(sv) => { obj.base.m_rid = sv.clone(); }
73                        crate::base::FieldValue::TextList(svs) => {
74                            if let Some(sv) = svs.last() { obj.base.m_rid = sv.clone(); }
75                        }
76                        _ => {}
77                    }
78                }
79                "IdentifiedObject.name" => {
80                    match val {
81                        crate::base::FieldValue::Text(sv) => { obj.base.name = sv.clone(); }
82                        crate::base::FieldValue::TextList(svs) => {
83                            if let Some(sv) = svs.last() { obj.base.name = sv.clone(); }
84                        }
85                        _ => {}
86                    }
87                }
88                "IdentifiedObject.shortName" => {
89                    match val {
90                        crate::base::FieldValue::Text(sv) => { obj.base.short_name = sv.clone(); }
91                        crate::base::FieldValue::TextList(svs) => {
92                            if let Some(sv) = svs.last() { obj.base.short_name = sv.clone(); }
93                        }
94                        _ => {}
95                    }
96                }
97                _ => {}
98            }
99        }
100        obj
101    }
102}