| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package differ | |
| import ( | |
| "github.com/zclconf/go-cty/cty" | |
| "github.com/hashicorp/terraform/internal/command/jsonformat/collections" | |
| "github.com/hashicorp/terraform/internal/command/jsonformat/computed" | |
| "github.com/hashicorp/terraform/internal/command/jsonformat/computed/renderers" | |
| "github.com/hashicorp/terraform/internal/command/jsonformat/structured" | |
| "github.com/hashicorp/terraform/internal/command/jsonprovider" | |
| "github.com/hashicorp/terraform/internal/plans" | |
| ) | |
| func computeAttributeDiffAsMap(change structured.Change, elementType cty.Type) computed.Diff { | |
| mapValue := change.AsMap() | |
| elements, current := collections.TransformMap(mapValue.Before, mapValue.After, mapValue.AllKeys(), func(key string) computed.Diff { | |
| value := mapValue.GetChild(key) | |
| if !value.RelevantAttributes.MatchesPartial() { | |
| // Mark non-relevant attributes as unchanged. | |
| value = value.AsNoOp() | |
| } | |
| return ComputeDiffForType(value, elementType) | |
| }) | |
| return computed.NewDiff(renderers.Map(elements), current, change.ReplacePaths.Matches()) | |
| } | |
| func computeAttributeDiffAsNestedMap(change structured.Change, attributes map[string]*jsonprovider.Attribute) computed.Diff { | |
| mapValue := change.AsMap() | |
| elements, current := collections.TransformMap(mapValue.Before, mapValue.After, mapValue.ExplicitKeys(), func(key string) computed.Diff { | |
| value := mapValue.GetChild(key) | |
| if !value.RelevantAttributes.MatchesPartial() { | |
| // Mark non-relevant attributes as unchanged. | |
| value = value.AsNoOp() | |
| } | |
| return computeDiffForNestedAttribute(value, &jsonprovider.NestedType{ | |
| Attributes: attributes, | |
| NestingMode: "single", | |
| }) | |
| }) | |
| return computed.NewDiff(renderers.NestedMap(elements), current, change.ReplacePaths.Matches()) | |
| } | |
| func computeBlockDiffsAsMap(change structured.Change, block *jsonprovider.Block) (map[string]computed.Diff, plans.Action) { | |
| mapValue := change.AsMap() | |
| return collections.TransformMap(mapValue.Before, mapValue.After, mapValue.ExplicitKeys(), func(key string) computed.Diff { | |
| value := mapValue.GetChild(key) | |
| if !value.RelevantAttributes.MatchesPartial() { | |
| // Mark non-relevant attributes as unchanged. | |
| value = value.AsNoOp() | |
| } | |
| return ComputeDiffForBlock(value, block) | |
| }) | |
| } |