Skip to content

Commit

Permalink
Fix JSON when object is first to be pushed
Browse files Browse the repository at this point in the history
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
  • Loading branch information
IxDay committed May 27, 2019
1 parent ffd0e96 commit 4440139
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
12 changes: 8 additions & 4 deletions internal/json/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -373,12 +373,16 @@ 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:
// Three conditions apply here:
// 1. new content starts with '{' - which shd be dropped OR
// 2. existing content has already other fields
// 2. new content starts with '{' - which shd 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, ',')
}
Expand Down
20 changes: 20 additions & 0 deletions internal/json/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
})
}
}

0 comments on commit 4440139

Please sign in to comment.