basyx_rs/
asset_administration_shell.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::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    // Identifiable
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub administration: Option<AdministrativeInformation>,
39
40    pub id: String,
41
42    // HasDataSpecification
43    #[serde(skip_serializing_if = "Option::is_none")]
44    #[serde(rename = "embeddedDataSpecifications")]
45    pub embedded_data_specifications: Option<Vec<EmbeddedDataSpecification>>,
46
47    // AssetAdministrationShell
48    #[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    ///Create a new AssetAdministrationShell
61    ///
62    /// id should be a valid Identifier (IRI, IRDI, ...).
63    ///
64    /// asset_information must have at least the asset_kind.
65    ///
66    /// # Example:
67    ///
68    ///```
69    ///use basyx_rs::{AssetAdministrationShell, AssetInformation, AssetKind};
70    ///
71    ///let my_aas = AssetAdministrationShell::new(
72    ///                "https://example.com/id/123".to_string(),
73    ///                AssetInformation::new(AssetKind::Instance));
74    ///
75    /// ```
76    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}