1use 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 #[serde(skip_serializing_if = "Option::is_none")]
39 pub administration: Option<AdministrativeInformation>,
40
41 pub id: String,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub kind: Option<ModellingKind>,
46
47 #[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 #[serde(skip_serializing_if = "Option::is_none")]
58 pub qualifiers: Option<Vec<Qualifier>>,
59
60 #[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}