pkg/mptf_plan.go (59 lines of code) (raw):
package pkg
import (
"fmt"
"github.com/Azure/golden"
"strings"
)
var _ golden.Plan = &MetaProgrammingTFPlan{}
func RunMetaProgrammingTFPlan(c *MetaProgrammingTFConfig) (*MetaProgrammingTFPlan, error) {
if err := c.RunPlan(); err != nil {
return nil, err
}
plan := &MetaProgrammingTFPlan{
c: c,
}
plan.Transforms = append(plan.Transforms, golden.Blocks[Transform](c)...)
return plan, nil
}
type MetaProgrammingTFPlan struct {
c *MetaProgrammingTFConfig
Transforms []Transform
}
func (m *MetaProgrammingTFPlan) String() string {
sb := strings.Builder{}
for _, t := range m.Transforms {
sb.WriteString(fmt.Sprintf("%s would be apply:\n %s\n", t.Address(), golden.BlockToString(t)))
sb.WriteString("\n---\n")
}
return sb.String()
}
func (m *MetaProgrammingTFPlan) Apply() error {
var err error
addresses := make(map[string]struct{})
for _, transform := range m.Transforms {
addresses[transform.Address()] = struct{}{}
}
if err = golden.Traverse[Transform](m.c.BaseConfig, func(b Transform) error {
if _, ok := addresses[b.Address()]; !ok {
return nil
}
if err := golden.Decode(b); err != nil {
return fmt.Errorf("%s(%s) decode error: %+v", b.Address(), b.HclBlock().Range().String(), err)
}
return nil
}); err != nil {
return err
}
if err = golden.Traverse[Transform](m.c.BaseConfig, func(b Transform) error {
if _, ok := addresses[b.Address()]; !ok {
return nil
}
return b.Apply()
}); err != nil {
return fmt.Errorf("errors applying transforms: %+v", err)
}
if err = m.c.SaveToDisk(); err != nil {
return fmt.Errorf("errors saving changes: %+v", err)
}
return nil
}