in pkg/cloud/rgraph/algo/traversal/traversal.go [30:74]
func ConnectedSubgraph(g *rgraph.Graph, n rnode.Node) ([]rnode.Node, error) {
if g.Get(n.ID()) == nil {
return nil, fmt.Errorf("starting node %s not in graph", n.ID())
}
done := map[cloud.ResourceMapKey]rnode.Node{}
var work algo.Queue[rnode.Node]
work.Add(n)
for !work.Empty() {
cur := work.Pop()
done[cur.ID().MapKey()] = cur
refs := cur.OutRefs()
for _, ref := range refs {
if _, ok := done[ref.To.MapKey()]; ok {
continue
}
to := g.Get(ref.To)
if to == nil {
return nil, fmt.Errorf("invalid graph: to node %v not in graph", ref.To)
}
work.Add(to)
}
refs = cur.InRefs()
for _, ref := range refs {
if _, ok := done[ref.From.MapKey()]; ok {
continue
}
from := g.Get(ref.From)
if from == nil {
return nil, fmt.Errorf("invalid graph: from node %v not in graph", ref.From)
}
work.Add(from)
}
}
var ret []rnode.Node
for _, node := range done {
ret = append(ret, node)
}
return ret, nil
}