aboutsummaryrefslogtreecommitdiff
path: root/server/tools/src/recipe_diagram.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/tools/src/recipe_diagram.rs')
-rw-r--r--server/tools/src/recipe_diagram.rs45
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,
+ });
+ }
+ }
+}