From 70f184d49794412c1e334a0d3cb217ccf772a555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Reigota?= Date: Mon, 24 May 2021 15:43:46 +0100 Subject: [PATCH 1/2] Fixed MarshalJSON Error on YAML Extend #3414 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Reigota --- pkg/parser/yaml/parser.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/pkg/parser/yaml/parser.go b/pkg/parser/yaml/parser.go index 69946056d32..4ab00c89e0e 100644 --- a/pkg/parser/yaml/parser.go +++ b/pkg/parser/yaml/parser.go @@ -48,7 +48,42 @@ func (p *Parser) Parse(filePath string, fileContent []byte) ([]model.Document, e } } - return documents, nil + return convertKeysToString(documents), nil +} + +// convertKeysToString goes through every document to convert map[interface{}]interface{} +// to map[string]interface{} +func convertKeysToString(docs []model.Document) []model.Document { + documents := make([]model.Document, 0, len(docs)) + for _, doc := range docs { + for key, value := range doc { + doc[key] = convert(value) + } + documents = append(documents, doc) + } + return documents +} + +// convert goes recursively through the keys in the given value and converts nested maps type of map[interface{}]interface{} +// to map[string]interface{} +func convert(value interface{}) interface{} { + switch t := value.(type) { + case map[interface{}]interface{}: + mapStr := map[string]interface{}{} + for key, val := range t { + mapStr[key.(string)] = convert(val) + } + return mapStr + case []interface{}: + for key, val := range t { + t[key] = convert(val) + } + case model.Document: + for key, val := range t { + t[key] = convert(val) + } + } + return value } // SupportedExtensions returns extensions supported by this parser, which are yaml and yml extension From e9bc41946ceaadd50a79ad452379c2ef2a4d2fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Reigota?= Date: Mon, 24 May 2021 17:20:07 +0100 Subject: [PATCH 2/2] Added unit test for nested map case --- pkg/parser/yaml/parser_test.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pkg/parser/yaml/parser_test.go b/pkg/parser/yaml/parser_test.go index 6b6c9c2295c..680f363b4fc 100644 --- a/pkg/parser/yaml/parser_test.go +++ b/pkg/parser/yaml/parser_test.go @@ -42,8 +42,13 @@ martin2: mode: create permission: authenticated-read `, ` --name: test --name: test2 +test: + - &test_anchor + group: + name: "cx" +test_2: + perm: + - <<: *test_anchor `, } @@ -57,6 +62,13 @@ martin2: require.NoError(t, err) require.Len(t, playbook, 1) require.Contains(t, playbook[0]["playbooks"].([]interface{})[0].(map[string]interface{})["name"], "bucket2") + + nestedMap, err := p.Parse("test.yaml", []byte(have[2])) + require.NoError(t, err) + require.Len(t, nestedMap, 1) + require.Contains(t, nestedMap[0], "test_2") + require.Contains(t, + nestedMap[0]["test_2"].(model.Document)["perm"].([]interface{})[0].(map[string]interface{})["group"].(model.Document)["name"], "cx") } // Test_Resolve tests the functions [Resolve()] and all the methods called by them