From 3476ff28c43a4514a487575dc26d4572e403521e Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Wed, 9 Oct 2024 21:41:42 +0200 Subject: [PATCH] Correctly handle comments during JSON serialization. Signed-off-by: Felix Fontein --- stores/json/store.go | 20 +++++++----- stores/json/store_test.go | 67 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/stores/json/store.go b/stores/json/store.go index e9df1b554..3212b5b32 100644 --- a/stores/json/store.go +++ b/stores/json/store.go @@ -186,18 +186,20 @@ func (store Store) encodeValue(v interface{}) ([]byte, error) { func (store Store) encodeArray(array []interface{}) ([]byte, error) { out := "[" - for i, item := range array { + empty := true + for _, item := range array { if _, ok := item.(sops.Comment); ok { continue } + if !empty { + out += "," + } v, err := store.encodeValue(item) if err != nil { return nil, err } out += string(v) - if i != len(array)-1 { - out += "," - } + empty = false } out += "]" return []byte(out), nil @@ -205,10 +207,14 @@ func (store Store) encodeArray(array []interface{}) ([]byte, error) { func (store Store) encodeTree(tree sops.TreeBranch) ([]byte, error) { out := "{" - for i, item := range tree { + empty := true + for _, item := range tree { if _, ok := item.Key.(sops.Comment); ok { continue } + if !empty { + out += "," + } v, err := store.encodeValue(item.Value) if err != nil { return nil, fmt.Errorf("Error encoding value %s: %s", v, err) @@ -218,9 +224,7 @@ func (store Store) encodeTree(tree sops.TreeBranch) ([]byte, error) { return nil, fmt.Errorf("Error encoding key %s: %s", k, err) } out += string(k) + `: ` + string(v) - if i != len(tree)-1 { - out += "," - } + empty = false } return []byte(out + "}"), nil } diff --git a/stores/json/store_test.go b/stores/json/store_test.go index eca6d3e96..38f9882b5 100644 --- a/stores/json/store_test.go +++ b/stores/json/store_test.go @@ -540,3 +540,70 @@ func TestNoIndent(t *testing.T) { assert.Nil(t, err) assert.Equal(t, expected, string(out)) } + +func TestComments(t *testing.T) { + tree := sops.Tree{ + Branches: sops.TreeBranches{ + sops.TreeBranch{ + sops.TreeItem{ + Key: "foo", + Value: []interface{}{ + sops.Comment{Value: " comment 0"}, + sops.TreeBranch{ + sops.TreeItem{ + Key: sops.Comment{Value: " comment 1"}, + Value: nil, + }, + sops.TreeItem{ + Key: "foo", + Value: 3, + }, + sops.TreeItem{ + Key: sops.Comment{Value: " comment 2"}, + Value: nil, + }, + sops.TreeItem{ + Key: sops.Comment{Value: " comment 3"}, + Value: nil, + }, + sops.TreeItem{ + Key: "bar", + Value: false, + }, + sops.TreeItem{ + Key: sops.Comment{Value: " comment 4"}, + Value: nil, + }, + sops.TreeItem{ + Key: sops.Comment{Value: " comment 5"}, + Value: nil, + }, + }, + sops.Comment{Value: " comment 6"}, + sops.Comment{Value: " comment 7"}, + 2, + sops.Comment{Value: " comment 8"}, + sops.Comment{Value: " comment 9"}, + }, + }, + }, + }, + } + expected := `{ + "foo": [ + { + "foo": 3, + "bar": false + }, + 2 + ] +}` + store := Store{ + config: config.JSONStoreConfig{ + Indent: 2, + }, + } + out, err := store.EmitPlainFile(tree.Branches) + assert.Nil(t, err) + assert.Equal(t, expected, string(out)) +}