blob: 6b62ecc2851615a8e427bb59de136a1ed660820f [file] [log] [blame]
khenaidooac637102019-01-14 15:44:34 -05001package zerolog
2
3import (
4 "net"
5 "sort"
6 "time"
7)
8
9func appendFields(dst []byte, fields map[string]interface{}) []byte {
10 keys := make([]string, 0, len(fields))
11 for key := range fields {
12 keys = append(keys, key)
13 }
14 sort.Strings(keys)
15 for _, key := range keys {
16 dst = enc.AppendKey(dst, key)
17 val := fields[key]
18 if val, ok := val.(LogObjectMarshaler); ok {
19 e := newEvent(nil, 0)
20 e.buf = e.buf[:0]
21 e.appendObject(val)
22 dst = append(dst, e.buf...)
23 putEvent(e)
24 continue
25 }
26 switch val := val.(type) {
27 case string:
28 dst = enc.AppendString(dst, val)
29 case []byte:
30 dst = enc.AppendBytes(dst, val)
31 case error:
32 marshaled := ErrorMarshalFunc(val)
33 switch m := marshaled.(type) {
34 case LogObjectMarshaler:
35 e := newEvent(nil, 0)
36 e.buf = e.buf[:0]
37 e.appendObject(m)
38 dst = append(dst, e.buf...)
39 putEvent(e)
40 case error:
41 dst = enc.AppendString(dst, m.Error())
42 case string:
43 dst = enc.AppendString(dst, m)
44 default:
45 dst = enc.AppendInterface(dst, m)
46 }
47 case []error:
48 dst = enc.AppendArrayStart(dst)
49 for i, err := range val {
50 marshaled := ErrorMarshalFunc(err)
51 switch m := marshaled.(type) {
52 case LogObjectMarshaler:
53 e := newEvent(nil, 0)
54 e.buf = e.buf[:0]
55 e.appendObject(m)
56 dst = append(dst, e.buf...)
57 putEvent(e)
58 case error:
59 dst = enc.AppendString(dst, m.Error())
60 case string:
61 dst = enc.AppendString(dst, m)
62 default:
63 dst = enc.AppendInterface(dst, m)
64 }
65
66 if i < (len(val) - 1) {
67 enc.AppendArrayDelim(dst)
68 }
69 }
70 dst = enc.AppendArrayEnd(dst)
71 case bool:
72 dst = enc.AppendBool(dst, val)
73 case int:
74 dst = enc.AppendInt(dst, val)
75 case int8:
76 dst = enc.AppendInt8(dst, val)
77 case int16:
78 dst = enc.AppendInt16(dst, val)
79 case int32:
80 dst = enc.AppendInt32(dst, val)
81 case int64:
82 dst = enc.AppendInt64(dst, val)
83 case uint:
84 dst = enc.AppendUint(dst, val)
85 case uint8:
86 dst = enc.AppendUint8(dst, val)
87 case uint16:
88 dst = enc.AppendUint16(dst, val)
89 case uint32:
90 dst = enc.AppendUint32(dst, val)
91 case uint64:
92 dst = enc.AppendUint64(dst, val)
93 case float32:
94 dst = enc.AppendFloat32(dst, val)
95 case float64:
96 dst = enc.AppendFloat64(dst, val)
97 case time.Time:
98 dst = enc.AppendTime(dst, val, TimeFieldFormat)
99 case time.Duration:
100 dst = enc.AppendDuration(dst, val, DurationFieldUnit, DurationFieldInteger)
101 case *string:
102 if val != nil {
103 dst = enc.AppendString(dst, *val)
104 } else {
105 dst = enc.AppendNil(dst)
106 }
107 case *bool:
108 if val != nil {
109 dst = enc.AppendBool(dst, *val)
110 } else {
111 dst = enc.AppendNil(dst)
112 }
113 case *int:
114 if val != nil {
115 dst = enc.AppendInt(dst, *val)
116 } else {
117 dst = enc.AppendNil(dst)
118 }
119 case *int8:
120 if val != nil {
121 dst = enc.AppendInt8(dst, *val)
122 } else {
123 dst = enc.AppendNil(dst)
124 }
125 case *int16:
126 if val != nil {
127 dst = enc.AppendInt16(dst, *val)
128 } else {
129 dst = enc.AppendNil(dst)
130 }
131 case *int32:
132 if val != nil {
133 dst = enc.AppendInt32(dst, *val)
134 } else {
135 dst = enc.AppendNil(dst)
136 }
137 case *int64:
138 if val != nil {
139 dst = enc.AppendInt64(dst, *val)
140 } else {
141 dst = enc.AppendNil(dst)
142 }
143 case *uint:
144 if val != nil {
145 dst = enc.AppendUint(dst, *val)
146 } else {
147 dst = enc.AppendNil(dst)
148 }
149 case *uint8:
150 if val != nil {
151 dst = enc.AppendUint8(dst, *val)
152 } else {
153 dst = enc.AppendNil(dst)
154 }
155 case *uint16:
156 if val != nil {
157 dst = enc.AppendUint16(dst, *val)
158 } else {
159 dst = enc.AppendNil(dst)
160 }
161 case *uint32:
162 if val != nil {
163 dst = enc.AppendUint32(dst, *val)
164 } else {
165 dst = enc.AppendNil(dst)
166 }
167 case *uint64:
168 if val != nil {
169 dst = enc.AppendUint64(dst, *val)
170 } else {
171 dst = enc.AppendNil(dst)
172 }
173 case *float32:
174 if val != nil {
175 dst = enc.AppendFloat32(dst, *val)
176 } else {
177 dst = enc.AppendNil(dst)
178 }
179 case *float64:
180 if val != nil {
181 dst = enc.AppendFloat64(dst, *val)
182 } else {
183 dst = enc.AppendNil(dst)
184 }
185 case *time.Time:
186 if val != nil {
187 dst = enc.AppendTime(dst, *val, TimeFieldFormat)
188 } else {
189 dst = enc.AppendNil(dst)
190 }
191 case *time.Duration:
192 if val != nil {
193 dst = enc.AppendDuration(dst, *val, DurationFieldUnit, DurationFieldInteger)
194 } else {
195 dst = enc.AppendNil(dst)
196 }
197 case []string:
198 dst = enc.AppendStrings(dst, val)
199 case []bool:
200 dst = enc.AppendBools(dst, val)
201 case []int:
202 dst = enc.AppendInts(dst, val)
203 case []int8:
204 dst = enc.AppendInts8(dst, val)
205 case []int16:
206 dst = enc.AppendInts16(dst, val)
207 case []int32:
208 dst = enc.AppendInts32(dst, val)
209 case []int64:
210 dst = enc.AppendInts64(dst, val)
211 case []uint:
212 dst = enc.AppendUints(dst, val)
213 // case []uint8:
214 // dst = enc.AppendUints8(dst, val)
215 case []uint16:
216 dst = enc.AppendUints16(dst, val)
217 case []uint32:
218 dst = enc.AppendUints32(dst, val)
219 case []uint64:
220 dst = enc.AppendUints64(dst, val)
221 case []float32:
222 dst = enc.AppendFloats32(dst, val)
223 case []float64:
224 dst = enc.AppendFloats64(dst, val)
225 case []time.Time:
226 dst = enc.AppendTimes(dst, val, TimeFieldFormat)
227 case []time.Duration:
228 dst = enc.AppendDurations(dst, val, DurationFieldUnit, DurationFieldInteger)
229 case nil:
230 dst = enc.AppendNil(dst)
231 case net.IP:
232 dst = enc.AppendIPAddr(dst, val)
233 case net.IPNet:
234 dst = enc.AppendIPPrefix(dst, val)
235 case net.HardwareAddr:
236 dst = enc.AppendMACAddr(dst, val)
237 default:
238 dst = enc.AppendInterface(dst, val)
239 }
240 }
241 return dst
242}