Skip to content

Commit 28a15c8

Browse files
Bugfix Cast nil field (#84)
1 parent 4892eb1 commit 28a15c8

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

field.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ type Field struct {
5454

5555
// String will return Field as string
5656
func (f *Field) String() string {
57+
if f.Value == nil {
58+
return "<nil>"
59+
}
5760
switch f.Type {
5861
case SkipType:
5962
return "<skipped>"
@@ -113,6 +116,9 @@ func (f *Field) MarshalJSON() ([]byte, error) {
113116
if marshallable, ok := f.Value.(json.Marshaler); ok {
114117
return marshallable.MarshalJSON()
115118
}
119+
if f.Type == ErrorType && f.Value == nil {
120+
return []byte("null"), nil
121+
}
116122
switch f.Type {
117123
case BoolType, Int8Type, Int16Type, Int32Type, Int64Type, Uint8Type, Uint16Type, Uint32Type, Uint64Type, UintptrType, Float32Type, Float64Type:
118124
return []byte(f.String()), nil

field_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,17 @@ func TestField(t *testing.T) {
4545
{field: logger.Complex64("Complex64 field", 123), expectedValue: complex64(123), expectedType: logger.Complex64Type},
4646
{field: logger.Complex128("Complex128 field", 123), expectedValue: complex128(123), expectedType: logger.Complex128Type},
4747
{field: logger.String("String field", "my_value"), expectedValue: "my_value", expectedType: logger.StringType},
48+
{field: logger.Binary("Binary field null", nil), expectedValue: []byte(nil), expectedType: logger.BinaryType},
4849
{field: logger.Binary("Binary field", []byte("my_value")), expectedValue: []byte("my_value"), expectedType: logger.BinaryType},
50+
{field: logger.ByteString("ByteString field null", nil), expectedValue: []byte(nil), expectedType: logger.ByteStringType},
4951
{field: logger.ByteString("ByteString field", []byte("my_value")), expectedValue: []byte("my_value"), expectedType: logger.ByteStringType},
52+
{field: logger.Error("Error nil field", nil), expectedValue: nil, expectedType: logger.ErrorType},
5053
{field: logger.Error("Error field", err), expectedValue: err, expectedType: logger.ErrorType},
5154
{field: logger.Time("Time field", now), expectedValue: now, expectedType: logger.TimeType},
5255
{field: logger.Duration("Duration field", 5*time.Second), expectedValue: 5 * time.Second, expectedType: logger.DurationType},
56+
{field: logger.Stringer("Stringer nil field", nil), expectedValue: nil, expectedType: logger.StringerType},
5357
{field: logger.Stringer("Stringer field", MyStringer{}), expectedValue: MyStringer{}, expectedType: logger.StringerType},
58+
{field: logger.Reflect("Reflect nil field", nil), expectedValue: nil, expectedType: logger.ReflectType},
5459
{field: logger.Reflect("Reflect field", struct{}{}), expectedValue: struct{}{}, expectedType: logger.ReflectType},
5560
}
5661

@@ -127,12 +132,16 @@ func TestField_String(t *testing.T) {
127132
{field: logger.Complex64("Complex64 field", 6+7i), expectedString: "(6+7i)"},
128133
{field: logger.Complex128("Complex128 field", 6+7i), expectedString: "(6+7i)"},
129134
{field: logger.String("String field", "my_value"), expectedString: "my_value"},
135+
{field: logger.Binary("Binary nil field", nil), expectedString: ""},
130136
{field: logger.Binary("Binary field", []byte{1, 2, 3}), expectedString: "\x01\x02\x03"},
137+
{field: logger.ByteString("ByteString nil field", nil), expectedString: ""},
131138
{field: logger.ByteString("ByteString field", []byte("my_value")), expectedString: "my_value"},
139+
{field: logger.Error("Error nil field", nil), expectedString: "<nil>"},
132140
{field: logger.Error("Error field", err), expectedString: "my_error_value"},
133141
{field: logger.Time("Time field", now), expectedString: now.String()},
134142
{field: logger.Duration("Duration field", 5*time.Second), expectedString: "5s"},
135143
{field: logger.Stringer("Stringer field", MyStringer{}), expectedString: "my_stringer"},
144+
{field: logger.Reflect("Reflect nil field", nil), expectedString: "<nil>"},
136145
{field: logger.Reflect("Reflect field", struct{}{}), expectedString: "{}"},
137146
}
138147

@@ -170,12 +179,16 @@ func TestField_MarshalJSON(t *testing.T) {
170179
{field: logger.Complex64("Complex64 field", 6+7i), expectedString: `"(6+7i)"`},
171180
{field: logger.Complex128("Complex128 field", 6+7i), expectedString: `"(6+7i)"`},
172181
{field: logger.String("String field", "my_value"), expectedString: `"my_value"`},
182+
{field: logger.Binary("Binary nil field", nil), expectedString: `""`},
173183
{field: logger.Binary("Binary field", []byte{1, 2, 3}), expectedString: `"\x01\x02\x03"`},
184+
{field: logger.ByteString("ByteString nil field", nil), expectedString: `""`},
174185
{field: logger.ByteString("ByteString field", []byte("my_value")), expectedString: `"my_value"`},
186+
{field: logger.Error("Error nil field", nil), expectedString: "null"},
175187
{field: logger.Error("Error field", err), expectedString: `"my_error_value"`},
176188
{field: logger.Time("Time field", now), expectedString: string(nowMarshalled)},
177189
{field: logger.Duration("Duration field", 5*time.Second), expectedString: `"5s"`},
178190
{field: logger.Stringer("Stringer field", MyStringer{}), expectedString: `"my_stringer"`},
191+
{field: logger.Reflect("Reflect nil field", nil), expectedString: "null"},
179192
{field: logger.Reflect("Reflect field", struct{}{}), expectedString: "{}"},
180193
}
181194

0 commit comments

Comments
 (0)