diff --git a/internal/json/types.go b/internal/json/types.go index f343c86..bc8bc09 100644 --- a/internal/json/types.go +++ b/internal/json/types.go @@ -373,12 +373,17 @@ func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte { // AppendObjectData takes in an object that is already in a byte array // and adds it to the dst. func (Encoder) AppendObjectData(dst []byte, o []byte) []byte { - // Two conditions we want to put a ',' between existing content and - // new content: - // 1. new content starts with '{' - which shd be dropped OR - // 2. existing content has already other fields + // Three conditions apply here: + // 1. new content starts with '{' - which should be dropped OR + // 2. new content starts with '{' - which should be replaced with ',' + // to separate with existing content OR + // 3. existing content has already other fields if o[0] == '{' { - o[0] = ',' + if len(dst) == 0 { + o = o[1:] + } else { + o[0] = ',' + } } else if len(dst) > 1 { dst = append(dst, ',') } diff --git a/internal/json/types_test.go b/internal/json/types_test.go index f396299..9a9d668 100644 --- a/internal/json/types_test.go +++ b/internal/json/types_test.go @@ -165,3 +165,23 @@ func Test_appendMac(t *testing.T) { }) } } + +func Test_appendObjectData(t *testing.T) { + tests := []struct { + dst []byte + obj []byte + want []byte + }{ + {[]byte{}, []byte(`{"foo":"bar"}`), []byte(`"foo":"bar"}`)}, + {[]byte(`{"qux":"quz"`), []byte(`{"foo":"bar"}`), []byte(`{"qux":"quz","foo":"bar"}`)}, + {[]byte{}, []byte(`"foo":"bar"`), []byte(`"foo":"bar"`)}, + {[]byte(`{"qux":"quz"`), []byte(`"foo":"bar"`), []byte(`{"qux":"quz","foo":"bar"`)}, + } + for _, tt := range tests { + t.Run("ObjectData", func(t *testing.T) { + if got := enc.AppendObjectData(tt.dst, tt.obj); !reflect.DeepEqual(got, tt.want) { + t.Errorf("appendObjectData() = %s, want %s", got, tt.want) + } + }) + } +}