generate/
generate.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 basyx_rs::prelude::*;
7use basyx_rs::{
8    id_short_from_str, AssetAdministrationShell, AssetInformation, AssetKind, DataTypeDefXsd,
9    KeyTypes, ReferenceTypes,
10};
11use color_eyre::eyre::Result;
12use std::io::Write;
13
14fn main() -> Result<()> {
15    let mut technical_data =
16        Submodel::new("http://i40.customer.com/type/1/1/7A7104BDAB57E184".into());
17
18    technical_data.semantic_id = Some(Reference::new(
19        ReferenceTypes::ExternalReference,
20        Key::new(KeyTypes::GlobalReference, "0173-1#01-AFZ615#016".into()),
21    ));
22
23    if let Some(id_short) = id_short_from_str("my_submodel1").ok() {
24        technical_data.id_short = Some(id_short);
25    }
26
27    let mut property = Property::new(DataTypeDefXsd::XsBoolean);
28    property.category = Some(format!("{}", Category::CONSTANT));
29
30    if let Some(id_short) = id_short_from_str("my_property1").ok() {
31        property.id_short = Some(id_short);
32    }
33
34    property.value = Some("true".to_string());
35
36    let sme = SubmodelElement::Property(property);
37
38    let mut sm = Submodel::new("https://example.com/ids/1234567890".to_string());
39
40    if let Some(id_short) = id_short_from_str("my_submodel1").ok() {
41        sm.id_short = Some(id_short);
42    }
43
44    sm.add_submodel_element(sme.clone());
45
46    let mut aas = AssetAdministrationShell::new(
47        "https://example.com/ids/0987654321".to_string(),
48        AssetInformation::new(AssetKind::Instance),
49    );
50
51    if let Some(id_short) = id_short_from_str("my_aas1").ok() {
52        aas.id_short = Some(id_short);
53    }
54    // unfortunately, aascheck won't notice, if the id_short is malformed.
55    //aas.id_short = Some("_id_short".to_string());
56
57    aas.add_reference_to_submodel(&sm, ReferenceTypes::ModelReference, true);
58
59    serialize("submodel1.json", &sm).ok();
60    serialize("aas1.json", &aas)
61}
62
63fn serialize<T: serde::ser::Serialize>(path: &str, element: &T) -> Result<()> {
64    let json = serde_json::to_vec(element)?;
65    let mut file = std::fs::OpenOptions::new()
66        .create(true)
67        .write(true)
68        .read(true)
69        .truncate(true)
70        .open(path)?;
71    file.write_all(&json)?;
72
73    println!("Generated: {}", path);
74    Ok(())
75}