63 lines
2.0 KiB
Rust
63 lines
2.0 KiB
Rust
//! Frozen schema5/6/7 top-level envelope. No schema8 definition catalog/defaults.
|
|
//! Unchanged nested records are shared only after the closed old-kind check.
|
|
use crate::persistence::FileError;
|
|
use crate::*;
|
|
use serde::Deserialize;
|
|
use std::collections::BTreeMap;
|
|
|
|
#[derive(Deserialize)]
|
|
#[serde(deny_unknown_fields)]
|
|
pub(crate) struct Project7 {
|
|
pub schema_version: u32,
|
|
pub id: Id,
|
|
pub alias: String,
|
|
pub name: String,
|
|
pub description: String,
|
|
#[serde(deserialize_with = "crate::unique_id_map")]
|
|
pub elements: BTreeMap<Id, Element>,
|
|
#[serde(deserialize_with = "crate::unique_id_map")]
|
|
pub relations: BTreeMap<Id, Relation>,
|
|
#[serde(deserialize_with = "crate::unique_id_map")]
|
|
pub diagrams: BTreeMap<Id, Diagram>,
|
|
#[serde(deserialize_with = "crate::unique_id_map")]
|
|
pub artifact_links: BTreeMap<Id, ArtifactLink>,
|
|
#[serde(deserialize_with = "crate::unique_id_map")]
|
|
pub traces: BTreeMap<Id, Trace>,
|
|
}
|
|
impl Project7 {
|
|
pub(crate) fn into_current(self) -> Result<Project, FileError> {
|
|
if !(5..=7).contains(&self.schema_version) {
|
|
return Err(FileError::Invalid(
|
|
"Expected frozen schema5, 6 or 7.".into(),
|
|
));
|
|
}
|
|
reject_elements(self.elements.values())?;
|
|
Ok(Project {
|
|
schema_version: self.schema_version,
|
|
id: self.id,
|
|
alias: self.alias,
|
|
name: self.name,
|
|
description: self.description,
|
|
definitions: BTreeMap::new(),
|
|
elements: self.elements,
|
|
relations: self.relations,
|
|
diagrams: self.diagrams,
|
|
artifact_links: self.artifact_links,
|
|
traces: self.traces,
|
|
})
|
|
}
|
|
}
|
|
pub(crate) fn reject_elements<'a>(
|
|
elements: impl Iterator<Item = &'a Element>,
|
|
) -> Result<(), FileError> {
|
|
for element in elements {
|
|
if element.kind().is_analysis() {
|
|
return Err(FileError::Invalid(format!(
|
|
"{:?} requires schema/source 8.",
|
|
element.kind()
|
|
)));
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|