pkg/transform_append_block_body.go (54 lines of code) (raw):

package pkg import ( "encoding/json" "fmt" "github.com/Azure/golden" "github.com/Azure/mapotf/pkg/terraform" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclwrite" ) var _ Transform = &AppendBlockBodyTransform{} type AppendBlockBodyTransform struct { *golden.BaseBlock *BaseTransform TargetBlockAddress string `hcl:"target_block_address" validate:"required"` BlockBody string `hcl:"block_body" validate:"required"` } func (u *AppendBlockBodyTransform) Type() string { return "append_block_body" } func (u *AppendBlockBodyTransform) Apply() error { c := u.Config().(*MetaProgrammingTFConfig) b := c.RootBlock(u.TargetBlockAddress) if b == nil { return fmt.Errorf("cannot find block: %s", u.TargetBlockAddress) } cfg, diag := hclwrite.ParseConfig([]byte("append {\n"+u.BlockBody+"\n}"), "append.hcl", hcl.InitialPos) if diag.HasErrors() { return fmt.Errorf("failed to parse block body in %s, body is %s: %s", u.Address(), u.BlockBody, diag.Error()) } u.PatchWriteBlock(b, cfg.Body().Blocks()[0].Body()) return nil } func (u *AppendBlockBodyTransform) PatchWriteBlock(dest terraform.Block, patch *hclwrite.Body) { // we cannot patch one-line block if dest.Range().Start.Line == dest.Range().End.Line { dest.WriteBody().AppendNewline() } for name, attr := range patch.Attributes() { dest.SetAttributeRaw(name, attr.Expr().BuildTokens(nil)) } for _, nb := range patch.Blocks() { dest.AppendBlock(nb) } } func (u *AppendBlockBodyTransform) String() string { content := make(map[string]any) content["id"] = u.Id() content["target_block_address"] = u.TargetBlockAddress content["concat"] = u.BlockBody str, err := json.Marshal(content) if err != nil { panic(err.Error()) } return string(str) }