blob: 84b5e862c0bd36901bfdf4204d0759d868d5cc75 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package graph
import (
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/dag"
"github.com/hashicorp/terraform/internal/terraform"
)
type GraphNodeReferenceable interface {
Referenceable() addrs.Referenceable
}
type GraphNodeReferencer interface {
References() []*addrs.Reference
}
var _ terraform.GraphTransformer = (*ReferenceTransformer)(nil)
type ReferenceTransformer struct{}
func (r *ReferenceTransformer) Transform(graph *terraform.Graph) error {
nodes := addrs.MakeMap[addrs.Referenceable, dag.Vertex]()
for referenceable := range dag.SelectSeq[GraphNodeReferenceable](graph.VerticesSeq()) {
nodes.Put(referenceable.Referenceable(), referenceable)
}
for referencer := range dag.SelectSeq[GraphNodeReferencer](graph.VerticesSeq()) {
for _, reference := range referencer.References() {
if target, ok := nodes.GetOk(reference.Subject); ok {
graph.Connect(dag.BasicEdge(referencer, target))
}
}
}
return nil
}