63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package terraform
|
|
|
|
import (
|
|
"github.com/hashicorp/terraform/dag"
|
|
)
|
|
|
|
// GraphNodeProxy must be implemented by nodes that are proxies.
|
|
//
|
|
// A node that is a proxy says that anything that depends on this
|
|
// node (the proxy), should also copy all the things that the proxy
|
|
// itself depends on. Example:
|
|
//
|
|
// A => proxy => C
|
|
//
|
|
// Should transform into (two edges):
|
|
//
|
|
// A => proxy => C
|
|
// A => C
|
|
//
|
|
// The purpose for this is because some transforms only look at direct
|
|
// edge connections and the proxy generally isn't meaningful in those
|
|
// situations, so we should complete all the edges.
|
|
type GraphNodeProxy interface {
|
|
Proxy() bool
|
|
}
|
|
|
|
// ProxyTransformer is a transformer that goes through the graph, finds
|
|
// vertices that are marked as proxies, and connects through their
|
|
// dependents. See above for what a proxy is.
|
|
type ProxyTransformer struct{}
|
|
|
|
func (t *ProxyTransformer) Transform(g *Graph) error {
|
|
for _, v := range g.Vertices() {
|
|
pn, ok := v.(GraphNodeProxy)
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
// If we don't want to be proxies, don't do it
|
|
if !pn.Proxy() {
|
|
continue
|
|
}
|
|
|
|
// Connect all the things that depend on this to things that
|
|
// we depend on as the proxy. See docs for GraphNodeProxy for
|
|
// a visual explanation.
|
|
for _, s := range g.UpEdges(v).List() {
|
|
for _, t := range g.DownEdges(v).List() {
|
|
g.Connect(GraphProxyEdge{
|
|
Edge: dag.BasicEdge(s, t),
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GraphProxyEdge is the edge that is used for proxied edges.
|
|
type GraphProxyEdge struct {
|
|
dag.Edge
|
|
}
|