Files
ARCADIA-Studio/crates/oa-core/src/migration_v7.rs
T

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(())
}