49 lines
1.4 KiB
Go
49 lines
1.4 KiB
Go
package terraform
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/hashicorp/terraform/dag"
|
|
)
|
|
|
|
// GraphNodeExapndable is an interface that nodes can implement to
|
|
// signal that they can be expanded. Expanded nodes turn into
|
|
// GraphNodeSubgraph nodes within the graph.
|
|
type GraphNodeExpandable interface {
|
|
Expand(GraphBuilder) (GraphNodeSubgraph, error)
|
|
}
|
|
|
|
// GraphNodeDynamicExpandable is an interface that nodes can implement
|
|
// to signal that they can be expanded at eval-time (hence dynamic).
|
|
// These nodes are given the eval context and are expected to return
|
|
// a new subgraph.
|
|
type GraphNodeDynamicExpandable interface {
|
|
DynamicExpand(EvalContext) (*Graph, error)
|
|
}
|
|
|
|
// GraphNodeSubgraph is an interface a node can implement if it has
|
|
// a larger subgraph that should be walked.
|
|
type GraphNodeSubgraph interface {
|
|
Subgraph() dag.Grapher
|
|
}
|
|
|
|
// ExpandTransform is a transformer that does a subgraph expansion
|
|
// at graph transform time (vs. at eval time). The benefit of earlier
|
|
// subgraph expansion is that errors with the graph build can be detected
|
|
// at an earlier stage.
|
|
type ExpandTransform struct {
|
|
Builder GraphBuilder
|
|
}
|
|
|
|
func (t *ExpandTransform) Transform(v dag.Vertex) (dag.Vertex, error) {
|
|
ev, ok := v.(GraphNodeExpandable)
|
|
if !ok {
|
|
// This isn't an expandable vertex, so just ignore it.
|
|
return v, nil
|
|
}
|
|
|
|
// Expand the subgraph!
|
|
log.Printf("[DEBUG] vertex %q: static expanding", dag.VertexName(ev))
|
|
return ev.Expand(t.Builder)
|
|
}
|