mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-26 17:01:04 -06:00
30bf83cdeb
In order to make this work reasonably we can't avoid using some funny heuristics, which are somewhat reasonable to apply within the context of Terraform itself but would not be good to add to the general "logutils". Specifically, this is adding the additional heuristic that lines starting with spaces are continuation lines and so should inherit the log level of the most recent non-continuation line.
64 lines
2.0 KiB
Go
64 lines
2.0 KiB
Go
package terraform
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/hashicorp/terraform/dag"
|
|
"github.com/hashicorp/terraform/helper/logging"
|
|
)
|
|
|
|
// GraphTransformer is the interface that transformers implement. This
|
|
// interface is only for transforms that need entire graph visibility.
|
|
type GraphTransformer interface {
|
|
Transform(*Graph) error
|
|
}
|
|
|
|
// GraphVertexTransformer is an interface that transforms a single
|
|
// Vertex within with graph. This is a specialization of GraphTransformer
|
|
// that makes it easy to do vertex replacement.
|
|
//
|
|
// The GraphTransformer that runs through the GraphVertexTransformers is
|
|
// VertexTransformer.
|
|
type GraphVertexTransformer interface {
|
|
Transform(dag.Vertex) (dag.Vertex, error)
|
|
}
|
|
|
|
// GraphTransformIf is a helper function that conditionally returns a
|
|
// GraphTransformer given. This is useful for calling inline a sequence
|
|
// of transforms without having to split it up into multiple append() calls.
|
|
func GraphTransformIf(f func() bool, then GraphTransformer) GraphTransformer {
|
|
if f() {
|
|
return then
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type graphTransformerMulti struct {
|
|
Transforms []GraphTransformer
|
|
}
|
|
|
|
func (t *graphTransformerMulti) Transform(g *Graph) error {
|
|
var lastStepStr string
|
|
for _, t := range t.Transforms {
|
|
log.Printf("[TRACE] (graphTransformerMulti) Executing graph transform %T", t)
|
|
if err := t.Transform(g); err != nil {
|
|
return err
|
|
}
|
|
if thisStepStr := g.StringWithNodeTypes(); thisStepStr != lastStepStr {
|
|
log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T with new graph:\n%s ------", t, logging.Indent(thisStepStr))
|
|
lastStepStr = thisStepStr
|
|
} else {
|
|
log.Printf("[TRACE] (graphTransformerMulti) Completed graph transform %T (no changes)", t)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GraphTransformMulti combines multiple graph transformers into a single
|
|
// GraphTransformer that runs all the individual graph transformers.
|
|
func GraphTransformMulti(ts ...GraphTransformer) GraphTransformer {
|
|
return &graphTransformerMulti{Transforms: ts}
|
|
}
|