basyx_rs/
submodel.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
6use crate::administrative_information::AdministrativeInformation;
7use crate::embedded_data_specification::EmbeddedDataSpecification;
8use crate::modelling_kind::ModellingKind;
9use crate::qualifier::Qualifier;
10use crate::reference::Reference;
11use crate::submodel_element::SubmodelElement;
12use crate::Extension;
13use crate::LangString as LangStringNameType;
14use crate::LangString as LangStringTextType;
15use serde::{Deserialize, Serialize};
16
17#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
18#[serde(tag = "modelType")]
19pub struct Submodel {
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub extensions: Option<Vec<Extension>>,
22
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub category: Option<String>,
25
26    #[serde(skip_serializing_if = "Option::is_none")]
27    #[serde(rename = "idShort")]
28    pub id_short: Option<String>,
29
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[serde(rename = "displayName")]
32    pub display_name: Option<Vec<LangStringNameType>>,
33
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub description: Option<Vec<LangStringTextType>>,
36
37    // Identifiable
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub administration: Option<AdministrativeInformation>,
40
41    pub id: String,
42
43    // HasKind
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub kind: Option<ModellingKind>,
46
47    // HasSemantics
48    #[serde(skip_serializing_if = "Option::is_none")]
49    #[serde(rename = "semanticId")]
50    pub semantic_id: Option<Reference>,
51
52    #[serde(skip_serializing_if = "Option::is_none")]
53    #[serde(rename = "supplementalSemanticIds")]
54    pub supplemental_semantic_ids: Option<Vec<Reference>>,
55
56    // Qualifiable
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub qualifiers: Option<Vec<Qualifier>>,
59
60    // HasDataSpecification
61    #[serde(skip_serializing_if = "Option::is_none")]
62    #[serde(rename = "embeddedDataSpecifications")]
63    pub embedded_data_specifications: Option<Vec<EmbeddedDataSpecification>>,
64
65    #[serde(skip_serializing_if = "Option::is_none")]
66    #[serde(rename = "submodelElements")]
67    pub submodel_elements: Option<Vec<SubmodelElement>>,
68}
69
70impl Submodel {
71    pub fn new(id: String) -> Self {
72        Self {
73            extensions: None,
74            category: None,
75            id_short: None,
76            display_name: None,
77            id,
78            kind: None,
79            semantic_id: None,
80            supplemental_semantic_ids: None,
81            qualifiers: None,
82            embedded_data_specifications: None,
83            description: None,
84            administration: None,
85            submodel_elements: None,
86        }
87    }
88
89    pub fn add_submodel_element(&mut self, element: SubmodelElement) {
90        if let Some(v) = self.submodel_elements.as_mut() {
91            v.push(element);
92        } else {
93            self.submodel_elements = Some(vec![element]);
94        }
95    }
96}