pub mod semantic_ids;
mod mapper;
mod model;
mod property;
mod sectors;
mod templates;
#[cfg(test)]
mod tests;
pub use mapper::map_dpp_to_aas_submodel;
pub use model::{
AasCollection, AasDataType, AasProperty, AasReference, AasSemId, AasSemIdKey, AasShell,
AasSubmodel, AasSubmodelElement, AasSubmodelRef, AssetInformation, SpecificAssetId,
};
pub use property::{boolean_property, double_property, integer_property, string_property};
pub use templates::{SubmodelTemplate, placeholder_templates, sector_submodel_template};
use dpp_domain::Passport;
pub fn build_aas_from_passport(passport: &Passport, gtin: &str) -> (AasShell, Vec<AasSubmodel>) {
let passport_id = passport.id.to_string();
let mut specific_asset_ids = vec![
SpecificAssetId {
name: "gtin".into(),
value: gtin.to_owned(),
},
SpecificAssetId {
name: "serialId".into(),
value: passport_id.clone(),
},
];
if let Some(batch) = &passport.batch_id {
specific_asset_ids.push(SpecificAssetId {
name: "batchId".into(),
value: batch.clone(),
});
}
let mut submodels = vec![
sectors::build_product_identification_submodel(passport),
sectors::build_manufacturer_submodel(passport),
sectors::build_environmental_impact_submodel(passport),
sectors::build_material_composition_submodel(passport),
sectors::build_repairability_submodel(passport),
];
if let Some(sd) = &passport.sector_data {
submodels.push(sectors::build_sector_submodel(sd, &passport_id));
}
let shell = AasShell {
id: format!("urn:odal-node:aas:{passport_id}"),
id_short: "DigitalProductPassport".into(),
model_type: "AssetAdministrationShell".into(),
kind: "Instance".into(),
asset_information: AssetInformation {
global_asset_id: format!("urn:odal-node:product:{gtin}"),
specific_asset_ids,
},
submodels: submodels
.iter()
.map(|s| AasSubmodelRef { id: s.id.clone() })
.collect(),
};
(shell, submodels)
}