From 20aae6dde6f825d6b3107c71a833242088a31e40 Mon Sep 17 00:00:00 2001 From: Thomas Rodgers Date: Thu, 20 Apr 2023 12:48:25 -0700 Subject: [PATCH] Merge resources recursively (#7783) --- tools/missing-test-detector/reader.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tools/missing-test-detector/reader.go b/tools/missing-test-detector/reader.go index f9b054910bc..86d4c3fc0f3 100644 --- a/tools/missing-test-detector/reader.go +++ b/tools/missing-test-detector/reader.go @@ -277,11 +277,7 @@ func readHCLBlockBody(body hcl.Body, fileBytes []byte) (Resource, error) { if existing, ok := m[block.Type]; ok { // Merge the fields from the current block into the existing resource config. if existingResource, ok := existing.(Resource); ok { - for k, v := range blockConfig { - if _, ok := existingResource[k]; !ok { - existingResource[k] = v - } - } + mergeResources(existingResource, blockConfig) } } else { m[block.Type] = blockConfig @@ -292,3 +288,18 @@ func readHCLBlockBody(body hcl.Body, fileBytes []byte) (Resource, error) { } return m, nil } + +// Perform a recursive one-way merge of b into a. +func mergeResources(a, b Resource) { + for k, bv := range b { + if av, ok := a[k]; ok { + if avr, ok := av.(Resource); ok { + if bvr, ok := bv.(Resource); ok { + mergeResources(avr, bvr) + } + } + } else { + a[k] = bv + } + } +}