pub mod aasx;
pub mod converter;
pub mod json;
pub mod models;
pub mod xml;
use crate::error::Result;
use crate::metamodel::Aspect;
use models::AasEnvironment;
use std::path::Path;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AasFormat {
Xml,
Json,
Aasx,
}
impl AasFormat {
pub fn from_path(path: &Path) -> Result<Self> {
let extension = path
.extension()
.and_then(|ext| ext.to_str())
.ok_or_else(|| {
crate::SammError::ParseError("Unable to determine file format".into())
})?;
match extension.to_lowercase().as_str() {
"xml" => Ok(AasFormat::Xml),
"json" => Ok(AasFormat::Json),
"aasx" => Ok(AasFormat::Aasx),
other => Err(crate::SammError::ParseError(format!(
"Unsupported AAS file format: .{}",
other
))),
}
}
}
pub async fn parse_aas_file(path: &Path) -> Result<AasEnvironment> {
let format = AasFormat::from_path(path)?;
match format {
AasFormat::Xml => xml::parse_xml_file(path).await,
AasFormat::Json => json::parse_json_file(path).await,
AasFormat::Aasx => aasx::parse_aasx_file(path).await,
}
}
pub fn convert_to_aspects(
env: &AasEnvironment,
submodel_indices: Vec<usize>,
) -> Result<Vec<Aspect>> {
converter::convert_environment_to_aspects(env, submodel_indices)
}
pub fn list_submodels(
env: &AasEnvironment,
) -> Vec<(usize, String, Option<String>, Option<String>)> {
env.submodels
.iter()
.enumerate()
.map(|(idx, submodel)| {
let id = submodel.id.clone();
let name = submodel.id_short.clone();
let description = submodel
.description
.as_ref()
.and_then(|descs| descs.first().map(|lang_str| lang_str.text.clone()));
(idx, id, name, description)
})
.collect()
}