//! 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, #[serde(deserialize_with = "crate::unique_id_map")] pub relations: BTreeMap, #[serde(deserialize_with = "crate::unique_id_map")] pub diagrams: BTreeMap, #[serde(deserialize_with = "crate::unique_id_map")] pub artifact_links: BTreeMap, #[serde(deserialize_with = "crate::unique_id_map")] pub traces: BTreeMap, } impl Project7 { pub(crate) fn into_current(self) -> Result { 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, ) -> Result<(), FileError> { for element in elements { if element.kind().is_analysis() { return Err(FileError::Invalid(format!( "{:?} requires schema/source 8.", element.kind() ))); } } Ok(()) }