basyx_rs/
asset_administration_shell.rs1use crate::key_types::KeyTypes;
7use crate::LangString as LangStringNameType;
8use crate::LangString as LangStringTextType;
9use crate::{
10 administrative_information::AdministrativeInformation, asset_information::AssetInformation,
11 embedded_data_specification::EmbeddedDataSpecification, reference::Reference, Extension, Key,
12 ReferenceTypes, Submodel,
13};
14use serde::{Deserialize, Serialize};
15
16#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
17#[serde(tag = "modelType")]
18pub struct AssetAdministrationShell {
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub extensions: Option<Vec<Extension>>,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub category: Option<String>,
24
25 #[serde(skip_serializing_if = "Option::is_none")]
26 #[serde(rename = "idShort")]
27 pub id_short: Option<String>,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
30 #[serde(rename = "displayName")]
31 pub display_name: Option<Vec<LangStringNameType>>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub description: Option<Vec<LangStringTextType>>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub administration: Option<AdministrativeInformation>,
39
40 pub id: String,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
44 #[serde(rename = "embeddedDataSpecifications")]
45 pub embedded_data_specifications: Option<Vec<EmbeddedDataSpecification>>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 #[serde(rename = "derivedFrom")]
50 pub derived_from: Option<Reference>,
51
52 #[serde(rename = "assetInformation")]
53 pub asset_information: AssetInformation,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub submodels: Option<Vec<Reference>>,
57}
58
59impl AssetAdministrationShell {
60 pub fn new(id: String, asset_information: AssetInformation) -> Self {
77 Self {
78 extensions: None,
79 category: None,
80 id_short: None,
81 display_name: None,
82 id,
83 embedded_data_specifications: None,
84 derived_from: None,
85 asset_information,
86 description: None,
87 administration: None,
88 submodels: None,
89 }
90 }
91
92 pub fn add_reference_to_submodel(
93 &mut self,
94 submodel: &Submodel,
95 type_: ReferenceTypes,
96 include_referred_semantic_id: bool,
97 ) {
98 let mut reference =
99 Reference::new(type_, Key::new(KeyTypes::Submodel, submodel.id.clone()));
100
101 if include_referred_semantic_id {
102 if let Some(rsid) = &submodel.semantic_id {
103 reference.referred_semantic_id = Some(Box::new(rsid.clone()));
104 }
105 }
106
107 if let Some(v) = self.submodels.as_mut() {
108 v.push(reference);
109 } else {
110 self.submodels = Some(vec![reference]);
111 }
112 }
113
114 pub fn delete_reference_to_submodel(&mut self, index: usize) {
115 if let Some(v) = self.submodels.as_mut() {
116 if index < v.len() {
117 v.remove(index);
118 }
119 }
120 }
121}