aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/tools/src/recipe_diagram.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs
index 8e9c14b6..ec7656b9 100644
--- a/server/tools/src/recipe_diagram.rs
+++ b/server/tools/src/recipe_diagram.rs
@@ -98,7 +98,7 @@ pub(crate) fn recipe_diagram(
let index = diag.nodes.len();
let recipe = data.recipe(r.index);
- if matches!(recipe, Recipe::Instant { .. }) && r.outputs.len() == 1 {
+ if matches!(recipe, Recipe::Instant { .. }) && r.outputs.len() == 1 && r.inputs.len() >= 1 {
for i in r.inputs {
diag.edges.push(DiagramEdge {
src: item_index[&i],
@@ -141,6 +141,7 @@ pub(crate) fn recipe_diagram(
}
merge_combine_clusters(&mut diag);
+ remove_orphan_nodes(&mut diag);
Ok(diag)
}
@@ -205,3 +206,22 @@ fn merge_combine_clusters(diag: &mut Diagram) {
}
}
}
+
+fn remove_orphan_nodes(diag: &mut Diagram) {
+ let mut to_remove = diag
+ .nodes
+ .iter()
+ .enumerate()
+ .filter(|&(i, _)| !diag.edges.iter().any(|e| e.src == i || e.dst == i))
+ .map(|(i, _)| i)
+ .collect::<Vec<_>>();
+ to_remove.sort_by_key(|x| Reverse(*x));
+
+ for e in &mut diag.edges {
+ e.src -= to_remove.iter().filter(|&&i| i < e.src).count();
+ e.dst -= to_remove.iter().filter(|&&i| i < e.dst).count();
+ }
+ for i in to_remove {
+ diag.nodes.remove(i);
+ }
+}