basyx_rs/submodel_element/
mod.rs

1// SPDX-FileCopyrightText: 2021 Fraunhofer Institute for Experimental Software Engineering IESE
2// SPDX-FileCopyrightText: 2023 Jan Hecht
3//
4// SPDX-License-Identifier: MIT
5
6mod aas_submodel_elements;
7mod annotated_relationship_element;
8mod basic_event_element;
9mod blob;
10mod capability;
11mod data_element;
12mod data_element_choice;
13mod direction;
14mod embedded_data_specification;
15mod entity;
16mod entity_type;
17mod event_payload;
18mod file;
19mod multi_language_property;
20mod operation;
21mod operation_variable;
22mod property;
23mod range;
24mod reference_element;
25mod relationship_element;
26mod state_of_event;
27mod submodel_element_collection;
28mod submodel_element_list;
29
30pub use aas_submodel_elements::AasSubmodelElements;
31pub use annotated_relationship_element::AnnotatedRelationshipElement;
32pub use basic_event_element::BasicEventElement;
33pub use blob::Blob;
34pub use capability::Capability;
35pub use data_element::DataElement;
36pub use data_element_choice::DataElementChoice;
37pub use embedded_data_specification::EmbeddedDataSpecification;
38pub use entity::Entity;
39pub use entity_type::EntityType;
40pub use event_payload::EventPayload;
41pub use file::File;
42pub use multi_language_property::MultiLanguageProperty;
43pub use operation::Operation;
44pub use operation_variable::OperationVariable;
45pub use property::Property;
46pub use range::Range;
47pub use reference_element::ReferenceElement;
48pub use relationship_element::RelationshipElement;
49pub use submodel_element_collection::SubmodelElementCollection;
50pub use submodel_element_list::SubmodelElementList;
51
52use serde::{Deserialize, Serialize};
53
54#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
55#[serde(tag = "modelType")]
56pub enum SubmodelElement {
57    AnnotatedRelationshipElement(AnnotatedRelationshipElement),
58    BasicEventElement(BasicEventElement),
59    Blob(Blob),
60    Capability(Capability),
61    DataElement(DataElement),
62    Entity(Entity),
63    File(File),
64    MultiLanguageProperty(MultiLanguageProperty),
65    Operation(Operation),
66    Property(Property),
67    Range(Range),
68    ReferenceElement(ReferenceElement),
69    RelationshipElement(RelationshipElement),
70    SubmodelElementCollection(SubmodelElementCollection),
71    SubmodelElementList(SubmodelElementList),
72}
73
74impl SubmodelElement {
75    pub fn get_id_short(&self) -> Option<String> {
76        match self {
77            SubmodelElement::AnnotatedRelationshipElement(element) => element.id_short.clone(),
78            SubmodelElement::BasicEventElement(element) => element.id_short.clone(),
79            SubmodelElement::Blob(element) => element.id_short.clone(),
80            SubmodelElement::Capability(element) => element.id_short.clone(),
81            SubmodelElement::DataElement(element) => element.id_short.clone(),
82            SubmodelElement::Entity(element) => element.id_short.clone(),
83            SubmodelElement::File(element) => element.id_short.clone(),
84            SubmodelElement::MultiLanguageProperty(element) => element.id_short.clone(),
85            SubmodelElement::Operation(element) => element.id_short.clone(),
86            SubmodelElement::Property(element) => element.id_short.clone(),
87            SubmodelElement::Range(element) => element.id_short.clone(),
88            SubmodelElement::ReferenceElement(element) => element.id_short.clone(),
89            SubmodelElement::RelationshipElement(element) => element.id_short.clone(),
90            SubmodelElement::SubmodelElementCollection(element) => element.id_short.clone(),
91            SubmodelElement::SubmodelElementList(element) => element.id_short.clone(),
92        }
93    }
94}
95
96#[cfg(test)]
97mod tests {
98    use super::*;
99    use crate::{
100        id_short_from_str, Category, DataTypeDefXsd, Key, KeyTypes, Reference, ReferenceTypes,
101    };
102
103    #[test]
104    fn deserialize_submodel_element_property() {
105        let input = r#"{
106                    "modelType": "Property",
107                    "semanticId":
108                    {
109                        "keys": [
110                            {
111                                "type": "ConceptDescription",
112                                "value": "0173-1#02-BAA120#008"
113                            }
114                        ],
115                        "type": "ExternalReference"
116                    },
117                    "value": "5000",
118                    "valueType": "xs:integer",
119                    "category": "PARAMETER",
120                    "idShort": "MaxRotationSpeed"
121                }"#;
122
123        let ut: SubmodelElement = serde_json::from_str(input).unwrap();
124        //let ut_enum: SubmodelElement = SubmodelElement::Property(ut);
125
126        let mut prop = Property::new(DataTypeDefXsd::XsInteger);
127        prop.semantic_id = Some(Reference::new(
128            ReferenceTypes::ExternalReference,
129            Key::new(
130                KeyTypes::ConceptDescription,
131                "0173-1#02-BAA120#008".to_string(),
132            ),
133        ));
134        prop.value = Some("5000".to_string());
135        prop.category = Some(Category::PARAMETER.to_string());
136        prop.id_short = id_short_from_str("MaxRotationSpeed").ok();
137
138        let sme_prop = SubmodelElement::Property(prop);
139
140        assert_eq!(ut, sme_prop);
141    }
142}