2023-05-02 11:33:06 -04:00
|
|
|
// Copyright IBM Corp. 2014, 2026
|
2023-08-10 18:43:27 -04:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-05-02 11:33:06 -04:00
|
|
|
|
2023-01-10 11:24:48 -05:00
|
|
|
package renderers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"fmt"
|
|
|
|
|
|
2023-01-11 03:35:36 -05:00
|
|
|
"github.com/hashicorp/terraform/internal/command/jsonformat/computed"
|
2023-01-10 11:24:48 -05:00
|
|
|
"github.com/hashicorp/terraform/internal/plans"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ computed.DiffRenderer = (*setRenderer)(nil)
|
|
|
|
|
|
|
|
|
|
func Set(elements []computed.Diff) computed.DiffRenderer {
|
|
|
|
|
return &setRenderer{
|
|
|
|
|
elements: elements,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-11 04:20:24 -05:00
|
|
|
func NestedSet(elements []computed.Diff) computed.DiffRenderer {
|
|
|
|
|
return &setRenderer{
|
|
|
|
|
elements: elements,
|
|
|
|
|
overrideForcesReplacement: true,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-10 11:24:48 -05:00
|
|
|
type setRenderer struct {
|
|
|
|
|
NoWarningsRenderer
|
|
|
|
|
|
|
|
|
|
elements []computed.Diff
|
2023-01-11 04:20:24 -05:00
|
|
|
|
|
|
|
|
overrideForcesReplacement bool
|
2023-01-10 11:24:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (renderer setRenderer) RenderHuman(diff computed.Diff, indent int, opts computed.RenderHumanOpts) string {
|
2023-01-11 04:20:24 -05:00
|
|
|
// Sets are a bit finicky, nested sets don't render the forces replacement
|
|
|
|
|
// suffix themselves, but push it onto their children. So if we are
|
|
|
|
|
// overriding the forces replacement setting, we set it to true for children
|
|
|
|
|
// and false for ourselves.
|
|
|
|
|
displayForcesReplacementInSelf := diff.Replace && !renderer.overrideForcesReplacement
|
|
|
|
|
displayForcesReplacementInChildren := diff.Replace && renderer.overrideForcesReplacement
|
|
|
|
|
|
2023-01-10 11:24:48 -05:00
|
|
|
if len(renderer.elements) == 0 {
|
2023-01-12 10:47:06 -05:00
|
|
|
return fmt.Sprintf("[]%s%s", nullSuffix(diff.Action, opts), forcesReplacement(displayForcesReplacementInSelf, opts))
|
2023-01-10 11:24:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
elementOpts := opts.Clone()
|
|
|
|
|
elementOpts.OverrideNullSuffix = true
|
2024-09-11 08:20:14 -04:00
|
|
|
elementOpts.ForceForcesReplacement = displayForcesReplacementInChildren
|
2023-01-10 11:24:48 -05:00
|
|
|
|
|
|
|
|
unchangedElements := 0
|
|
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
2023-01-12 10:47:06 -05:00
|
|
|
buf.WriteString(fmt.Sprintf("[%s\n", forcesReplacement(displayForcesReplacementInSelf, opts)))
|
2023-01-10 11:24:48 -05:00
|
|
|
for _, element := range renderer.elements {
|
|
|
|
|
if element.Action == plans.NoOp && !opts.ShowUnchangedChildren {
|
|
|
|
|
unchangedElements++
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-12 10:47:06 -05:00
|
|
|
for _, warning := range element.WarningsHuman(indent+1, opts) {
|
2023-01-10 11:24:48 -05:00
|
|
|
buf.WriteString(fmt.Sprintf("%s%s\n", formatIndent(indent+1), warning))
|
|
|
|
|
}
|
2023-02-07 03:14:14 -05:00
|
|
|
buf.WriteString(fmt.Sprintf("%s%s%s,\n", formatIndent(indent+1), writeDiffActionSymbol(element.Action, elementOpts), element.RenderHuman(indent+1, elementOpts)))
|
2023-01-10 11:24:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if unchangedElements > 0 {
|
2023-02-07 03:14:14 -05:00
|
|
|
buf.WriteString(fmt.Sprintf("%s%s%s\n", formatIndent(indent+1), writeDiffActionSymbol(plans.NoOp, opts), unchanged("element", unchangedElements, opts)))
|
2023-01-10 11:24:48 -05:00
|
|
|
}
|
|
|
|
|
|
2023-02-07 03:14:14 -05:00
|
|
|
buf.WriteString(fmt.Sprintf("%s%s]%s", formatIndent(indent), writeDiffActionSymbol(plans.NoOp, opts), nullSuffix(diff.Action, opts)))
|
2023-01-10 11:24:48 -05:00
|
|
|
return buf.String()
|
|
|
|
|
}
|