| // Copyright (c) The OpenTofu Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| // Copyright (c) 2023 HashiCorp, Inc. | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package renderers | |
| import ( | |
| "sort" | |
| "github.com/opentofu/opentofu/internal/command/jsonformat/computed" | |
| ) | |
| // Blocks is a helper struct for collating the different kinds of blocks in a | |
| // simple way for rendering. | |
| type Blocks struct { | |
| SingleBlocks map[string]computed.Diff | |
| ListBlocks map[string][]computed.Diff | |
| SetBlocks map[string][]computed.Diff | |
| MapBlocks map[string]map[string]computed.Diff | |
| // ReplaceBlocks and Before/AfterSensitiveBlocks carry forward the | |
| // information about an entire group of blocks (eg. if all the blocks for a | |
| // given list block are sensitive that isn't captured in the individual | |
| // blocks as they are processed independently). These maps allow the | |
| // renderer to check the metadata on the overall groups and respond | |
| // accordingly. | |
| ReplaceBlocks map[string]bool | |
| BeforeSensitiveBlocks map[string]bool | |
| AfterSensitiveBlocks map[string]bool | |
| } | |
| func (blocks *Blocks) GetAllKeys() []string { | |
| var keys []string | |
| for key := range blocks.SingleBlocks { | |
| keys = append(keys, key) | |
| } | |
| for key := range blocks.ListBlocks { | |
| keys = append(keys, key) | |
| } | |
| for key := range blocks.SetBlocks { | |
| keys = append(keys, key) | |
| } | |
| for key := range blocks.MapBlocks { | |
| keys = append(keys, key) | |
| } | |
| sort.Strings(keys) | |
| return keys | |
| } | |
| func (blocks *Blocks) IsSingleBlock(key string) bool { | |
| _, ok := blocks.SingleBlocks[key] | |
| return ok | |
| } | |
| func (blocks *Blocks) IsListBlock(key string) bool { | |
| _, ok := blocks.ListBlocks[key] | |
| return ok | |
| } | |
| func (blocks *Blocks) IsMapBlock(key string) bool { | |
| _, ok := blocks.MapBlocks[key] | |
| return ok | |
| } | |
| func (blocks *Blocks) IsSetBlock(key string) bool { | |
| _, ok := blocks.SetBlocks[key] | |
| return ok | |
| } | |
| func (blocks *Blocks) AddSingleBlock(key string, diff computed.Diff, replace, beforeSensitive, afterSensitive bool) { | |
| blocks.SingleBlocks[key] = diff | |
| blocks.ReplaceBlocks[key] = replace | |
| blocks.BeforeSensitiveBlocks[key] = beforeSensitive | |
| blocks.AfterSensitiveBlocks[key] = afterSensitive | |
| } | |
| func (blocks *Blocks) AddAllListBlock(key string, diffs []computed.Diff, replace, beforeSensitive, afterSensitive bool) { | |
| blocks.ListBlocks[key] = diffs | |
| blocks.ReplaceBlocks[key] = replace | |
| blocks.BeforeSensitiveBlocks[key] = beforeSensitive | |
| blocks.AfterSensitiveBlocks[key] = afterSensitive | |
| } | |
| func (blocks *Blocks) AddAllSetBlock(key string, diffs []computed.Diff, replace, beforeSensitive, afterSensitive bool) { | |
| blocks.SetBlocks[key] = diffs | |
| blocks.ReplaceBlocks[key] = replace | |
| blocks.BeforeSensitiveBlocks[key] = beforeSensitive | |
| blocks.AfterSensitiveBlocks[key] = afterSensitive | |
| } | |
| func (blocks *Blocks) AddAllMapBlocks(key string, diffs map[string]computed.Diff, replace, beforeSensitive, afterSensitive bool) { | |
| blocks.MapBlocks[key] = diffs | |
| blocks.ReplaceBlocks[key] = replace | |
| blocks.BeforeSensitiveBlocks[key] = beforeSensitive | |
| blocks.AfterSensitiveBlocks[key] = afterSensitive | |
| } |