WIP checkpoint schema8 analysis core before user reboot

This commit is contained in:
Codex
2026-09-11 06:46:52 -07:00
parent 7d14bd0dd1
commit b96ff3935a
21 changed files with 3329 additions and 113 deletions
+66 -1
View File
@@ -19,6 +19,21 @@ pub enum Command {
},
CreateElement(Element),
EditElement(Id, Element),
CreateDefinition(crate::analysis::Definition),
EditDefinition(Id, crate::analysis::Definition),
SetAnalysisBase {
property: Id,
binding: crate::analysis::Binding,
},
SetAnalysisOverride {
case: Id,
property: Id,
binding: crate::analysis::Binding,
},
ClearAnalysisOverride {
case: Id,
property: Id,
},
CreateRelation(Relation),
EditRelation(Id, Relation),
CreateDiagram(Diagram),
@@ -453,6 +468,47 @@ fn apply_command(
}
Some(value.id)
}
Command::CreateDefinition(value) => {
vacant(p, value.id)?;
p.definitions.insert(value.id, value.clone());
Some(value.id)
}
Command::EditDefinition(old, value) => {
if !p.definitions.contains_key(old) { return Err(missing()); }
let mut definition = value.clone();
definition.id = *old;
p.definitions.insert(*old, definition);
reidentify_tracked(p, *old, value.id, provenance)?;
Some(value.id)
}
Command::SetAnalysisBase { property, binding } => {
let element = p.elements.get_mut(property).ok_or_else(missing)?;
let Some(SharedBody::EngineeringProperty { base, .. }) = element.shared_mut() else {
return Err(ModelError("SetAnalysisBase requires an engineering property.".into()));
};
*base = binding.clone();
Some(*property)
}
Command::SetAnalysisOverride { case, property, binding } => {
let element = p.elements.get_mut(case).ok_or_else(missing)?;
let Some(SharedBody::AnalysisCase { overrides, .. }) = element.shared_mut() else {
return Err(ModelError("SetAnalysisOverride requires an analysis case.".into()));
};
overrides.insert(*property, binding.clone());
Some(*case)
}
Command::ClearAnalysisOverride { case, property } => {
let target = p.elements.get(property).ok_or_else(missing)?;
if target.kind() != Kind::EngineeringProperty { return Err(ModelError("ClearAnalysisOverride requires an engineering property target.".into())); }
let layer = target.layer();
let element = p.elements.get_mut(case).ok_or_else(missing)?;
if element.layer() != layer { return Err(ModelError("Case and property must share a layer.".into())); }
let Some(SharedBody::AnalysisCase { overrides, .. }) = element.shared_mut() else {
return Err(ModelError("ClearAnalysisOverride requires an analysis case.".into()));
};
overrides.remove(property);
Some(*case)
}
Command::CreateRelation(value) => {
vacant(p, value.id)?;
p.relations.insert(value.id, value.clone());
@@ -835,6 +891,10 @@ fn edit_header(
assign(&mut p.name, &mut p.description, &mut p.alias);
return Ok(());
}
if let Some(v) = p.definitions.get_mut(&id) {
assign(&mut v.name, &mut v.description, &mut v.alias);
return Ok(());
}
if let Some(v) = p.elements.get_mut(&id) {
assign(&mut v.name, &mut v.description, &mut v.alias);
return Ok(());
@@ -878,8 +938,13 @@ pub fn reidentify(p: &mut Project, old: Id, new: Id) -> Result<(), ModelError> {
return Ok(());
}
vacant(p, new)?;
crate::analysis::references::check_remap(p, old, new)
.map_err(|error| ModelError(error.to_string()))?;
if p.id == old {
p.id = new;
} else if let Some(mut v) = p.definitions.remove(&old) {
v.id = new;
p.definitions.insert(new, v);
} else if let Some(mut v) = p.elements.remove(&old) {
v.id = new;
p.elements.insert(new, v);
@@ -904,7 +969,7 @@ pub fn reidentify(p: &mut Project, old: Id, new: Id) -> Result<(), ModelError> {
}
}
}
crate::references::remap_references(p, old, new);
crate::references::remap_references(p, old, new)?;
Ok(())
}
fn layout(p: &mut Project, diagram: Id) -> Result<(), ModelError> {