From 9938a23cba397691dbdc7a963304dbfedbe3a84c Mon Sep 17 00:00:00 2001 From: IxDay Date: Wed, 5 Jun 2019 08:48:09 +0200 Subject: [PATCH] Fix JSON when object is first to be pushed (#154) When pushing an object to the logger, and this object was the first field added. Zerolog was outputting an invalid json blob, issuing an extra comma before the object. This patch ensure that JSON is still valid even if an object is pushed first to the logger. Fixes #152 --- internal/json/types.go | 15 ++++++++++----- internal/json/types_test.go | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) 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) + } + }) + } +}