in mpdev/internal/resources/registry.go [132:174]
func (r *registry) topologicalSort() ([]Resource, error) {
dag := simple.NewDirectedGraph()
// Add resource references as nodes to graph
var refToID = map[Reference]int64{}
var idToRef = map[int64]Reference{}
for ref := range r.refMap {
n := dag.NewNode()
refToID[ref] = n.ID()
idToRef[n.ID()] = ref
dag.AddNode(n)
}
// Add dependencies as edges to graph
for ref, resource := range r.refMap {
to := dag.Node(refToID[ref])
for _, depRef := range resource.GetDependencies() {
depRes := r.GetResource(depRef)
if depRes == nil {
return []Resource{}, fmt.Errorf("resource not found with reference %+v", depRef)
}
from := dag.Node(refToID[depRef])
e := dag.NewEdge(from, to)
dag.SetEdge(e)
}
}
// Execute topological sort
nodes, err := topo.Sort(dag)
if err != nil {
return nil, err
}
// Convert node id to resource
resources := make([]Resource, 0, len(nodes))
for _, node := range nodes {
ref := idToRef[node.ID()]
resources = append(resources, r.refMap[ref])
}
return resources, err
}