pkg/transform_regex_replace_expression.go (56 lines of code) (raw):

package pkg import ( "regexp" "strings" "github.com/Azure/golden" "github.com/hashicorp/go-multierror" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/hashicorp/hcl/v2/hclwrite" ) var _ Transform = &RegexReplaceExpressionTransform{} type RegexReplaceExpressionTransform struct { *golden.BaseBlock *BaseTransform Regex string `hcl:"regex" validate:"required"` Replacement string `hcl:"replacement"` } func (r *RegexReplaceExpressionTransform) Type() string { return "regex_replace_expression" } func (r *RegexReplaceExpressionTransform) Apply() error { cfg := r.Config().(*MetaProgrammingTFConfig) re, err := regexp.Compile(r.Regex) if err != nil { return err } for _, block := range cfg.allRootBlocks { if subErr := r.applyRegexReplace(block.WriteBlock.Body(), block.Range().Filename, re); subErr != nil { err = multierror.Append(err, subErr) } } return err } func (r *RegexReplaceExpressionTransform) applyRegexReplace(body *hclwrite.Body, filename string, re *regexp.Regexp) error { var err error for name, attr := range body.Attributes() { oldValue := strings.TrimSpace(string(attr.Expr().BuildTokens(nil).Bytes())) newValue := re.ReplaceAllString(oldValue, r.Replacement) if oldValue == newValue { continue } tokens, diag := hclsyntax.LexExpression([]byte(newValue), filename, hcl.InitialPos) if diag.HasErrors() { err = multierror.Append(err, diag) continue } body.SetAttributeRaw(name, writerTokens(tokens)) } for _, block := range body.Blocks() { if subErr := r.applyRegexReplace(block.Body(), filename, re); subErr != nil { err = multierror.Append(err, subErr) continue } } return err }