@@ -46,18 +46,23 @@ func (ms *Marshaller) Nest() *Marshaller {
46
46
return ms
47
47
}
48
48
49
+ func derefValue (v * reflect.Value ) reflect.Kind {
50
+ k := v .Kind ()
51
+ for k == reflect .Pointer || k == reflect .Interface {
52
+ * v = v .Elem ()
53
+ k = v .Kind ()
54
+ }
55
+ return k
56
+ }
57
+
49
58
// NewMarshaller creates a new marshaller to serialize objects to log. If another marshaller
50
59
// is provided in "other", its internal state will be copied to the newly created marshaller.
51
60
func NewMarshaller (obj any , other ... * Marshaller ) * Marshaller {
52
61
v , ok := obj .(reflect.Value )
53
62
if ! ok {
54
63
v = reflect .ValueOf (obj )
55
64
}
56
- k := v .Kind ()
57
- for k == reflect .Pointer || k == reflect .Interface {
58
- v = v .Elem ()
59
- k = v .Kind ()
60
- }
65
+ derefValue (& v )
61
66
if len (other ) > 0 {
62
67
return & Marshaller {
63
68
value : v ,
@@ -123,6 +128,16 @@ func (ms *Marshaller) marshalZerologMap(e *zerolog.Event) {
123
128
}
124
129
}
125
130
131
+ func tryCastToTime (v reflect.Value ) * time.Time {
132
+ if ! v .CanInterface () {
133
+ return nil
134
+ }
135
+ if t , ok := v .Interface ().(time.Time ); ok {
136
+ return & t
137
+ }
138
+ return nil
139
+ }
140
+
126
141
func (ms * Marshaller ) MarshalZerologArray (a * zerolog.Array ) {
127
142
if k := ms .value .Kind (); k != reflect .Array && k != reflect .Slice {
128
143
return
@@ -133,11 +148,7 @@ func (ms *Marshaller) MarshalZerologArray(a *zerolog.Array) {
133
148
break
134
149
}
135
150
v := ms .value .Index (i )
136
- k := v .Kind ()
137
- for k == reflect .Interface || k == reflect .Pointer {
138
- v = v .Elem ()
139
- k = v .Kind ()
140
- }
151
+ k := derefValue (& v )
141
152
if k == reflect .Invalid {
142
153
continue
143
154
}
@@ -185,8 +196,8 @@ func (ms *Marshaller) MarshalZerologArray(a *zerolog.Array) {
185
196
case reflect .Float64 :
186
197
a .Float64 (v .Float ())
187
198
case reflect .Struct , reflect .Map :
188
- if t , ok := v . Interface ().(time. Time ); ok {
189
- a .Time (t )
199
+ if t := tryCastToTime ( v ); t != nil {
200
+ a .Time (* t )
190
201
} else if ms .nestedLevel + 1 > ms .nestedLevelLimit {
191
202
a .Str (v .String ())
192
203
} else {
@@ -218,11 +229,7 @@ func toSnakeCase(in string) string {
218
229
}
219
230
220
231
func (ms * Marshaller ) logField (e * zerolog.Event , fieldName string , field reflect.Value ) {
221
- k := field .Kind ()
222
- for k == reflect .Interface || k == reflect .Pointer {
223
- field = field .Elem ()
224
- k = field .Kind ()
225
- }
232
+ k := derefValue (& field )
226
233
if k == reflect .Invalid {
227
234
return
228
235
}
@@ -276,8 +283,8 @@ func (ms *Marshaller) logField(e *zerolog.Event, fieldName string, field reflect
276
283
e .Array (fieldName , NewMarshaller (field , ms ).Nest ())
277
284
}
278
285
case reflect .Struct , reflect .Map :
279
- if t , ok := field . Interface ().(time. Time ); ok {
280
- e .Time (fieldName , t )
286
+ if t := tryCastToTime ( field ); t != nil {
287
+ e .Time (fieldName , * t )
281
288
} else if ms .nestedLevel + 1 > ms .nestedLevelLimit {
282
289
e .Str (fieldName , field .String ())
283
290
} else {
0 commit comments