1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
7#[serde(rename_all = "camelCase")]
8pub struct AasSemIdKey {
9 #[serde(rename = "type")]
10 pub key_type: String,
11 pub value: String,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
19#[serde(rename_all = "camelCase")]
20pub struct AasSemId {
21 #[serde(rename = "type")]
22 pub ref_type: String,
23 pub keys: Vec<AasSemIdKey>,
24}
25
26impl AasSemId {
27 pub fn external(value: &str) -> Self {
29 Self {
30 ref_type: "ExternalReference".into(),
31 keys: vec![AasSemIdKey {
32 key_type: "GlobalReference".into(),
33 value: value.to_owned(),
34 }],
35 }
36 }
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43#[serde(rename_all = "camelCase")]
44pub enum AasDataType {
45 #[serde(rename = "xs:string")]
46 String,
47 #[serde(rename = "xs:double")]
48 Double,
49 #[serde(rename = "xs:integer")]
50 Integer,
51 #[serde(rename = "xs:boolean")]
52 Boolean,
53 #[serde(rename = "xs:dateTime")]
54 DateTime,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
59#[serde(rename_all = "camelCase")]
60pub struct AasProperty {
61 pub id_short: String,
62 pub value_type: AasDataType,
63 pub value: String,
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub unit: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub semantic_id: Option<AasSemId>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub description: Option<String>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
77#[serde(rename_all = "camelCase")]
78pub struct AasCollection {
79 pub id_short: String,
80 pub value: Vec<AasSubmodelElement>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub semantic_id: Option<AasSemId>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
90#[serde(rename_all = "camelCase")]
91pub struct AasReference {
92 pub id_short: String,
93 pub value: String,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub semantic_id: Option<AasSemId>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
101#[serde(tag = "modelType")]
102pub enum AasSubmodelElement {
103 Property(AasProperty),
104 SubmodelElementCollection(AasCollection),
105 Reference(AasReference),
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
110#[serde(rename_all = "camelCase")]
111pub struct AasSubmodel {
112 pub id: String,
113 pub id_short: String,
114 pub model_type: String,
116 pub kind: String,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub semantic_id: Option<AasSemId>,
120 pub submodel_elements: Vec<AasSubmodelElement>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
127#[serde(rename_all = "camelCase")]
128pub struct SpecificAssetId {
129 pub name: String,
130 pub value: String,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
139#[serde(rename_all = "camelCase")]
140pub struct AssetInformation {
141 pub global_asset_id: String,
142 pub specific_asset_ids: Vec<SpecificAssetId>,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
147#[serde(rename_all = "camelCase")]
148pub struct AasSubmodelRef {
149 pub id: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
159#[serde(rename_all = "camelCase")]
160pub struct AasShell {
161 pub id: String,
162 pub id_short: String,
163 pub model_type: String,
165 pub kind: String,
167 pub asset_information: AssetInformation,
168 pub submodels: Vec<AasSubmodelRef>,
169}