diff options
Diffstat (limited to 'server/tools/src/recipe_diagram.rs')
-rw-r--r-- | server/tools/src/recipe_diagram.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs index 2ed0179f..958e5aa9 100644 --- a/server/tools/src/recipe_diagram.rs +++ b/server/tools/src/recipe_diagram.rs @@ -125,5 +125,50 @@ pub(crate) fn recipe_diagram( } } + remove_instant_intermediate(&mut diag); + Ok(diag) } + +pub fn remove_instant_intermediate(diag: &mut Diagram) { + let instant_nodes = diag + .nodes + .iter() + .enumerate() + .filter(|(_, n)| matches!(n.style, NodeStyle::ProcessInstant)) + .map(|(i, _)| i) + .collect::<Vec<_>>(); + + for ni in instant_nodes { + let inputs = diag + .edges + .iter() + .enumerate() + .filter(|(_, e)| e.dst == ni) + .map(|(i, e)| (i, e.src)) + .collect::<Vec<_>>(); + let outputs = diag + .edges + .iter() + .enumerate() + .filter(|(_, e)| e.src == ni) + .map(|(i, e)| (i, e.dst)) + .collect::<Vec<_>>(); + + if inputs.len() == 1 && outputs.len() == 1 { + // order remove because index changes + if inputs[0].0 > outputs[0].0 { + diag.edges.remove(inputs[0].0); + diag.edges.remove(outputs[0].0); + } else { + diag.edges.remove(outputs[0].0); + diag.edges.remove(inputs[0].0); + } + diag.edges.push(DiagramEdge { + src: inputs[0].1, + dst: outputs[0].1, + label: None, + }); + } + } +} |