basyx_rs/submodel_element/
mod.rs1mod 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 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}