Get back some ns by removing the extra inferance added by binary support

benchstat old new
name                                   old time/op    new time/op    delta
LogEmpty-8                               15.2ns ±14%    13.4ns ± 3%  -12.11%  (p=0.008 n=5+5)
Disabled-8                               2.50ns ± 1%    2.28ns ± 6%   -8.81%  (p=0.008 n=5+5)
Info-8                                   44.4ns ± 1%    36.4ns ± 4%  -17.99%  (p=0.008 n=5+5)
ContextFields-8                          47.6ns ± 1%    39.4ns ± 7%  -17.30%  (p=0.008 n=5+5)
ContextAppend-8                          18.9ns ± 4%    15.2ns ± 4%  -19.68%  (p=0.008 n=5+5)
LogFields-8                               181ns ± 2%     173ns ± 2%   -4.63%  (p=0.008 n=5+5)
LogArrayObject-8                          530ns ± 3%     487ns ± 3%   -8.11%  (p=0.008 n=5+5)
LogFieldType/Int-8                       29.5ns ± 3%    28.8ns ± 2%     ~     (p=0.167 n=5+5)
LogFieldType/Interface-8                  180ns ± 7%     175ns ± 4%     ~     (p=0.579 n=5+5)
LogFieldType/Interface(Object)-8         87.8ns ± 3%    80.5ns ± 1%   -8.29%  (p=0.008 n=5+5)
LogFieldType/Object-8                    83.7ns ± 2%    77.2ns ± 3%   -7.76%  (p=0.008 n=5+5)
LogFieldType/Bools-8                     34.6ns ± 3%    32.3ns ± 6%   -6.64%  (p=0.032 n=5+5)
LogFieldType/Float-8                     43.0ns ± 4%    40.5ns ± 4%   -5.86%  (p=0.016 n=5+5)
LogFieldType/Str-8                       29.8ns ± 2%    26.5ns ± 5%  -11.01%  (p=0.008 n=5+5)
LogFieldType/Err-8                       32.8ns ± 2%    29.8ns ± 4%   -9.21%  (p=0.008 n=5+5)
LogFieldType/Durs-8                       309ns ± 3%     304ns ± 3%     ~     (p=0.238 n=5+5)
LogFieldType/Floats-8                     175ns ± 2%     174ns ± 3%     ~     (p=0.968 n=5+5)
LogFieldType/Strs-8                      51.0ns ± 3%    48.4ns ± 6%   -5.06%  (p=0.032 n=5+5)
LogFieldType/Dur-8                       44.5ns ± 3%    41.3ns ± 3%   -7.11%  (p=0.008 n=5+5)
LogFieldType/Interface(Objects)-8         758ns ± 3%     760ns ± 6%     ~     (p=1.000 n=5+5)
LogFieldType/Interfaces-8                 772ns ± 5%     762ns ± 4%     ~     (p=0.794 n=5+5)
LogFieldType/Bool-8                      28.0ns ± 6%    26.5ns ± 9%     ~     (p=0.143 n=5+5)
LogFieldType/Ints-8                      49.6ns ± 2%    46.2ns ± 2%   -6.70%  (p=0.008 n=5+5)
LogFieldType/Errs-8                      46.5ns ±11%    40.9ns ± 4%  -11.92%  (p=0.008 n=5+5)
LogFieldType/Time-8                       115ns ± 3%     113ns ± 3%     ~     (p=0.167 n=5+5)
LogFieldType/Times-8                      810ns ± 1%     811ns ± 3%     ~     (p=0.889 n=5+5)
ContextFieldType/Errs-8                   158ns ± 6%     156ns ±12%     ~     (p=1.000 n=5+5)
ContextFieldType/Times-8                  165ns ±11%     173ns ± 9%     ~     (p=0.651 n=5+5)
ContextFieldType/Interface-8              289ns ±13%     287ns ±11%     ~     (p=0.690 n=5+5)
ContextFieldType/Interface(Object)-8      285ns ±12%     297ns ± 6%     ~     (p=0.238 n=5+5)
ContextFieldType/Interface(Objects)-8     941ns ± 6%     941ns ± 5%     ~     (p=1.000 n=5+5)
ContextFieldType/Object-8                 201ns ± 5%     210ns ±12%     ~     (p=0.262 n=5+5)
ContextFieldType/Ints-8                   173ns ±10%     165ns ± 9%     ~     (p=0.198 n=5+5)
ContextFieldType/Floats-8                 297ns ± 6%     292ns ± 7%     ~     (p=0.579 n=5+5)
ContextFieldType/Timestamp-8              174ns ± 9%     174ns ±11%     ~     (p=0.810 n=5+5)
ContextFieldType/Durs-8                   445ns ± 9%     425ns ± 3%     ~     (p=0.151 n=5+5)
ContextFieldType/Interfaces-8             944ns ± 6%     876ns ±10%     ~     (p=0.095 n=5+5)
ContextFieldType/Strs-8                   179ns ±11%     165ns ±13%     ~     (p=0.135 n=5+5)
ContextFieldType/Dur-8                    158ns ± 8%     160ns ±19%     ~     (p=1.000 n=5+5)
ContextFieldType/Time-8                   152ns ±15%     148ns ±14%     ~     (p=0.952 n=5+5)
ContextFieldType/Str-8                    146ns ±12%     147ns ±16%     ~     (p=0.841 n=5+5)
ContextFieldType/Err-8                    138ns ±12%     145ns ±17%     ~     (p=0.595 n=5+5)
ContextFieldType/Int-8                    145ns ±10%     146ns ±13%     ~     (p=0.873 n=5+5)
ContextFieldType/Float-8                  181ns ± 9%     162ns ±12%     ~     (p=0.151 n=5+5)
ContextFieldType/Bool-8                   153ns ±10%     131ns ±19%     ~     (p=0.063 n=5+5)
ContextFieldType/Bools-8                  149ns ±11%     160ns ±16%     ~     (p=0.500 n=5+5)
This commit is contained in:
Olivier Poitrey 2018-05-10 15:01:41 -07:00
parent a572c9d1f6
commit ea1184be2b
23 changed files with 578 additions and 863 deletions

View File

@ -33,163 +33,163 @@ func (*Array) MarshalZerologArray(*Array) {
} }
func (a *Array) write(dst []byte) []byte { func (a *Array) write(dst []byte) []byte {
dst = appendArrayStart(dst) dst = enc.AppendArrayStart(dst)
if len(a.buf) > 0 { if len(a.buf) > 0 {
dst = append(append(dst, a.buf...)) dst = append(append(dst, a.buf...))
} }
dst = appendArrayEnd(dst) dst = enc.AppendArrayEnd(dst)
arrayPool.Put(a) arrayPool.Put(a)
return dst return dst
} }
// Object marshals an object that implement the LogObjectMarshaler // Object marshals an object that implement the LogObjectMarshaler
// interface and append it to the array. // interface and enc.Append it to the array.
func (a *Array) Object(obj LogObjectMarshaler) *Array { func (a *Array) Object(obj LogObjectMarshaler) *Array {
e := Dict() e := Dict()
obj.MarshalZerologObject(e) obj.MarshalZerologObject(e)
e.buf = appendEndMarker(e.buf) e.buf = enc.AppendEndMarker(e.buf)
a.buf = append(appendArrayDelim(a.buf), e.buf...) a.buf = append(enc.AppendArrayDelim(a.buf), e.buf...)
eventPool.Put(e) eventPool.Put(e)
return a return a
} }
// Str append the val as a string to the array. // Str enc.Append the val as a string to the array.
func (a *Array) Str(val string) *Array { func (a *Array) Str(val string) *Array {
a.buf = appendString(appendArrayDelim(a.buf), val) a.buf = enc.AppendString(enc.AppendArrayDelim(a.buf), val)
return a return a
} }
// Bytes append the val as a string to the array. // Bytes enc.Append the val as a string to the array.
func (a *Array) Bytes(val []byte) *Array { func (a *Array) Bytes(val []byte) *Array {
a.buf = appendBytes(appendArrayDelim(a.buf), val) a.buf = enc.AppendBytes(enc.AppendArrayDelim(a.buf), val)
return a return a
} }
// Hex append the val as a hex string to the array. // Hex enc.Append the val as a hex string to the array.
func (a *Array) Hex(val []byte) *Array { func (a *Array) Hex(val []byte) *Array {
a.buf = appendHex(appendArrayDelim(a.buf), val) a.buf = enc.AppendHex(enc.AppendArrayDelim(a.buf), val)
return a return a
} }
// Err append the err as a string to the array. // Err enc.Append the err as a string to the array.
func (a *Array) Err(err error) *Array { func (a *Array) Err(err error) *Array {
a.buf = appendError(appendArrayDelim(a.buf), err) a.buf = enc.AppendError(enc.AppendArrayDelim(a.buf), err)
return a return a
} }
// Bool append the val as a bool to the array. // Bool enc.Append the val as a bool to the array.
func (a *Array) Bool(b bool) *Array { func (a *Array) Bool(b bool) *Array {
a.buf = appendBool(appendArrayDelim(a.buf), b) a.buf = enc.AppendBool(enc.AppendArrayDelim(a.buf), b)
return a return a
} }
// Int append i as a int to the array. // Int enc.Append i as a int to the array.
func (a *Array) Int(i int) *Array { func (a *Array) Int(i int) *Array {
a.buf = appendInt(appendArrayDelim(a.buf), i) a.buf = enc.AppendInt(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Int8 append i as a int8 to the array. // Int8 enc.Append i as a int8 to the array.
func (a *Array) Int8(i int8) *Array { func (a *Array) Int8(i int8) *Array {
a.buf = appendInt8(appendArrayDelim(a.buf), i) a.buf = enc.AppendInt8(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Int16 append i as a int16 to the array. // Int16 enc.Append i as a int16 to the array.
func (a *Array) Int16(i int16) *Array { func (a *Array) Int16(i int16) *Array {
a.buf = appendInt16(appendArrayDelim(a.buf), i) a.buf = enc.AppendInt16(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Int32 append i as a int32 to the array. // Int32 enc.Append i as a int32 to the array.
func (a *Array) Int32(i int32) *Array { func (a *Array) Int32(i int32) *Array {
a.buf = appendInt32(appendArrayDelim(a.buf), i) a.buf = enc.AppendInt32(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Int64 append i as a int64 to the array. // Int64 enc.Append i as a int64 to the array.
func (a *Array) Int64(i int64) *Array { func (a *Array) Int64(i int64) *Array {
a.buf = appendInt64(appendArrayDelim(a.buf), i) a.buf = enc.AppendInt64(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Uint append i as a uint to the array. // Uint enc.Append i as a uint to the array.
func (a *Array) Uint(i uint) *Array { func (a *Array) Uint(i uint) *Array {
a.buf = appendUint(appendArrayDelim(a.buf), i) a.buf = enc.AppendUint(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Uint8 append i as a uint8 to the array. // Uint8 enc.Append i as a uint8 to the array.
func (a *Array) Uint8(i uint8) *Array { func (a *Array) Uint8(i uint8) *Array {
a.buf = appendUint8(appendArrayDelim(a.buf), i) a.buf = enc.AppendUint8(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Uint16 append i as a uint16 to the array. // Uint16 enc.Append i as a uint16 to the array.
func (a *Array) Uint16(i uint16) *Array { func (a *Array) Uint16(i uint16) *Array {
a.buf = appendUint16(appendArrayDelim(a.buf), i) a.buf = enc.AppendUint16(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Uint32 append i as a uint32 to the array. // Uint32 enc.Append i as a uint32 to the array.
func (a *Array) Uint32(i uint32) *Array { func (a *Array) Uint32(i uint32) *Array {
a.buf = appendUint32(appendArrayDelim(a.buf), i) a.buf = enc.AppendUint32(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Uint64 append i as a uint64 to the array. // Uint64 enc.Append i as a uint64 to the array.
func (a *Array) Uint64(i uint64) *Array { func (a *Array) Uint64(i uint64) *Array {
a.buf = appendUint64(appendArrayDelim(a.buf), i) a.buf = enc.AppendUint64(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// Float32 append f as a float32 to the array. // Float32 enc.Append f as a float32 to the array.
func (a *Array) Float32(f float32) *Array { func (a *Array) Float32(f float32) *Array {
a.buf = appendFloat32(appendArrayDelim(a.buf), f) a.buf = enc.AppendFloat32(enc.AppendArrayDelim(a.buf), f)
return a return a
} }
// Float64 append f as a float64 to the array. // Float64 enc.Append f as a float64 to the array.
func (a *Array) Float64(f float64) *Array { func (a *Array) Float64(f float64) *Array {
a.buf = appendFloat64(appendArrayDelim(a.buf), f) a.buf = enc.AppendFloat64(enc.AppendArrayDelim(a.buf), f)
return a return a
} }
// Time append t formated as string using zerolog.TimeFieldFormat. // Time enc.Append t formated as string using zerolog.TimeFieldFormat.
func (a *Array) Time(t time.Time) *Array { func (a *Array) Time(t time.Time) *Array {
a.buf = appendTime(appendArrayDelim(a.buf), t, TimeFieldFormat) a.buf = enc.AppendTime(enc.AppendArrayDelim(a.buf), t, TimeFieldFormat)
return a return a
} }
// Dur append d to the array. // Dur enc.Append d to the array.
func (a *Array) Dur(d time.Duration) *Array { func (a *Array) Dur(d time.Duration) *Array {
a.buf = appendDuration(appendArrayDelim(a.buf), d, DurationFieldUnit, DurationFieldInteger) a.buf = enc.AppendDuration(enc.AppendArrayDelim(a.buf), d, DurationFieldUnit, DurationFieldInteger)
return a return a
} }
// Interface append i marshaled using reflection. // Interface enc.Append i marshaled using reflection.
func (a *Array) Interface(i interface{}) *Array { func (a *Array) Interface(i interface{}) *Array {
if obj, ok := i.(LogObjectMarshaler); ok { if obj, ok := i.(LogObjectMarshaler); ok {
return a.Object(obj) return a.Object(obj)
} }
a.buf = appendInterface(appendArrayDelim(a.buf), i) a.buf = enc.AppendInterface(enc.AppendArrayDelim(a.buf), i)
return a return a
} }
// IPAddr adds IPv4 or IPv6 address to the array // IPAddr adds IPv4 or IPv6 address to the array
func (a *Array) IPAddr(ip net.IP) *Array { func (a *Array) IPAddr(ip net.IP) *Array {
a.buf = appendIPAddr(appendArrayDelim(a.buf), ip) a.buf = enc.AppendIPAddr(enc.AppendArrayDelim(a.buf), ip)
return a return a
} }
// IPPrefix adds IPv4 or IPv6 Prefix (IP + mask) to the array // IPPrefix adds IPv4 or IPv6 Prefix (IP + mask) to the array
func (a *Array) IPPrefix(pfx net.IPNet) *Array { func (a *Array) IPPrefix(pfx net.IPNet) *Array {
a.buf = appendIPPrefix(appendArrayDelim(a.buf), pfx) a.buf = enc.AppendIPPrefix(enc.AppendArrayDelim(a.buf), pfx)
return a return a
} }
// MACAddr adds a MAC (Ethernet) address to the array // MACAddr adds a MAC (Ethernet) address to the array
func (a *Array) MACAddr(ha net.HardwareAddr) *Array { func (a *Array) MACAddr(ha net.HardwareAddr) *Array {
a.buf = appendMACAddr(appendArrayDelim(a.buf), ha) a.buf = enc.AppendMACAddr(enc.AppendArrayDelim(a.buf), ha)
return a return a
} }

View File

@ -24,8 +24,8 @@ func (c Context) Fields(fields map[string]interface{}) Context {
// Dict adds the field key with the dict to the logger context. // Dict adds the field key with the dict to the logger context.
func (c Context) Dict(key string, dict *Event) Context { func (c Context) Dict(key string, dict *Event) Context {
dict.buf = appendEndMarker(dict.buf) dict.buf = enc.AppendEndMarker(dict.buf)
c.l.context = append(appendKey(c.l.context, key), dict.buf...) c.l.context = append(enc.AppendKey(c.l.context, key), dict.buf...)
eventPool.Put(dict) eventPool.Put(dict)
return c return c
} }
@ -34,7 +34,7 @@ func (c Context) Dict(key string, dict *Event) Context {
// Use zerolog.Arr() to create the array or pass a type that // Use zerolog.Arr() to create the array or pass a type that
// implement the LogArrayMarshaler interface. // implement the LogArrayMarshaler interface.
func (c Context) Array(key string, arr LogArrayMarshaler) Context { func (c Context) Array(key string, arr LogArrayMarshaler) Context {
c.l.context = appendKey(c.l.context, key) c.l.context = enc.AppendKey(c.l.context, key)
if arr, ok := arr.(*Array); ok { if arr, ok := arr.(*Array); ok {
c.l.context = arr.write(c.l.context) c.l.context = arr.write(c.l.context)
return c return c
@ -54,32 +54,32 @@ func (c Context) Array(key string, arr LogArrayMarshaler) Context {
func (c Context) Object(key string, obj LogObjectMarshaler) Context { func (c Context) Object(key string, obj LogObjectMarshaler) Context {
e := newEvent(levelWriterAdapter{ioutil.Discard}, 0) e := newEvent(levelWriterAdapter{ioutil.Discard}, 0)
e.Object(key, obj) e.Object(key, obj)
c.l.context = appendObjectData(c.l.context, e.buf) c.l.context = enc.AppendObjectData(c.l.context, e.buf)
eventPool.Put(e) eventPool.Put(e)
return c return c
} }
// Str adds the field key with val as a string to the logger context. // Str adds the field key with val as a string to the logger context.
func (c Context) Str(key, val string) Context { func (c Context) Str(key, val string) Context {
c.l.context = appendString(appendKey(c.l.context, key), val) c.l.context = enc.AppendString(enc.AppendKey(c.l.context, key), val)
return c return c
} }
// Strs adds the field key with val as a string to the logger context. // Strs adds the field key with val as a string to the logger context.
func (c Context) Strs(key string, vals []string) Context { func (c Context) Strs(key string, vals []string) Context {
c.l.context = appendStrings(appendKey(c.l.context, key), vals) c.l.context = enc.AppendStrings(enc.AppendKey(c.l.context, key), vals)
return c return c
} }
// Bytes adds the field key with val as a []byte to the logger context. // Bytes adds the field key with val as a []byte to the logger context.
func (c Context) Bytes(key string, val []byte) Context { func (c Context) Bytes(key string, val []byte) Context {
c.l.context = appendBytes(appendKey(c.l.context, key), val) c.l.context = enc.AppendBytes(enc.AppendKey(c.l.context, key), val)
return c return c
} }
// Hex adds the field key with val as a hex string to the logger context. // Hex adds the field key with val as a hex string to the logger context.
func (c Context) Hex(key string, val []byte) Context { func (c Context) Hex(key string, val []byte) Context {
c.l.context = appendHex(appendKey(c.l.context, key), val) c.l.context = enc.AppendHex(enc.AppendKey(c.l.context, key), val)
return c return c
} }
@ -88,21 +88,21 @@ func (c Context) Hex(key string, val []byte) Context {
// No sanity check is performed on b; it must not contain carriage returns and // No sanity check is performed on b; it must not contain carriage returns and
// be valid JSON. // be valid JSON.
func (c Context) RawJSON(key string, b []byte) Context { func (c Context) RawJSON(key string, b []byte) Context {
c.l.context = appendJSON(appendKey(c.l.context, key), b) c.l.context = appendJSON(enc.AppendKey(c.l.context, key), b)
return c return c
} }
// AnErr adds the field key with err as a string to the logger context. // AnErr adds the field key with err as a string to the logger context.
func (c Context) AnErr(key string, err error) Context { func (c Context) AnErr(key string, err error) Context {
if err != nil { if err != nil {
c.l.context = appendError(appendKey(c.l.context, key), err) c.l.context = enc.AppendError(enc.AppendKey(c.l.context, key), err)
} }
return c return c
} }
// Errs adds the field key with errs as an array of strings to the logger context. // Errs adds the field key with errs as an array of strings to the logger context.
func (c Context) Errs(key string, errs []error) Context { func (c Context) Errs(key string, errs []error) Context {
c.l.context = appendErrors(appendKey(c.l.context, key), errs) c.l.context = enc.AppendErrors(enc.AppendKey(c.l.context, key), errs)
return c return c
} }
@ -110,164 +110,164 @@ func (c Context) Errs(key string, errs []error) Context {
// To customize the key name, change zerolog.ErrorFieldName. // To customize the key name, change zerolog.ErrorFieldName.
func (c Context) Err(err error) Context { func (c Context) Err(err error) Context {
if err != nil { if err != nil {
c.l.context = appendError(appendKey(c.l.context, ErrorFieldName), err) c.l.context = enc.AppendError(enc.AppendKey(c.l.context, ErrorFieldName), err)
} }
return c return c
} }
// Bool adds the field key with val as a bool to the logger context. // Bool adds the field key with val as a bool to the logger context.
func (c Context) Bool(key string, b bool) Context { func (c Context) Bool(key string, b bool) Context {
c.l.context = appendBool(appendKey(c.l.context, key), b) c.l.context = enc.AppendBool(enc.AppendKey(c.l.context, key), b)
return c return c
} }
// Bools adds the field key with val as a []bool to the logger context. // Bools adds the field key with val as a []bool to the logger context.
func (c Context) Bools(key string, b []bool) Context { func (c Context) Bools(key string, b []bool) Context {
c.l.context = appendBools(appendKey(c.l.context, key), b) c.l.context = enc.AppendBools(enc.AppendKey(c.l.context, key), b)
return c return c
} }
// Int adds the field key with i as a int to the logger context. // Int adds the field key with i as a int to the logger context.
func (c Context) Int(key string, i int) Context { func (c Context) Int(key string, i int) Context {
c.l.context = appendInt(appendKey(c.l.context, key), i) c.l.context = enc.AppendInt(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Ints adds the field key with i as a []int to the logger context. // Ints adds the field key with i as a []int to the logger context.
func (c Context) Ints(key string, i []int) Context { func (c Context) Ints(key string, i []int) Context {
c.l.context = appendInts(appendKey(c.l.context, key), i) c.l.context = enc.AppendInts(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Int8 adds the field key with i as a int8 to the logger context. // Int8 adds the field key with i as a int8 to the logger context.
func (c Context) Int8(key string, i int8) Context { func (c Context) Int8(key string, i int8) Context {
c.l.context = appendInt8(appendKey(c.l.context, key), i) c.l.context = enc.AppendInt8(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Ints8 adds the field key with i as a []int8 to the logger context. // Ints8 adds the field key with i as a []int8 to the logger context.
func (c Context) Ints8(key string, i []int8) Context { func (c Context) Ints8(key string, i []int8) Context {
c.l.context = appendInts8(appendKey(c.l.context, key), i) c.l.context = enc.AppendInts8(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Int16 adds the field key with i as a int16 to the logger context. // Int16 adds the field key with i as a int16 to the logger context.
func (c Context) Int16(key string, i int16) Context { func (c Context) Int16(key string, i int16) Context {
c.l.context = appendInt16(appendKey(c.l.context, key), i) c.l.context = enc.AppendInt16(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Ints16 adds the field key with i as a []int16 to the logger context. // Ints16 adds the field key with i as a []int16 to the logger context.
func (c Context) Ints16(key string, i []int16) Context { func (c Context) Ints16(key string, i []int16) Context {
c.l.context = appendInts16(appendKey(c.l.context, key), i) c.l.context = enc.AppendInts16(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Int32 adds the field key with i as a int32 to the logger context. // Int32 adds the field key with i as a int32 to the logger context.
func (c Context) Int32(key string, i int32) Context { func (c Context) Int32(key string, i int32) Context {
c.l.context = appendInt32(appendKey(c.l.context, key), i) c.l.context = enc.AppendInt32(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Ints32 adds the field key with i as a []int32 to the logger context. // Ints32 adds the field key with i as a []int32 to the logger context.
func (c Context) Ints32(key string, i []int32) Context { func (c Context) Ints32(key string, i []int32) Context {
c.l.context = appendInts32(appendKey(c.l.context, key), i) c.l.context = enc.AppendInts32(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Int64 adds the field key with i as a int64 to the logger context. // Int64 adds the field key with i as a int64 to the logger context.
func (c Context) Int64(key string, i int64) Context { func (c Context) Int64(key string, i int64) Context {
c.l.context = appendInt64(appendKey(c.l.context, key), i) c.l.context = enc.AppendInt64(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Ints64 adds the field key with i as a []int64 to the logger context. // Ints64 adds the field key with i as a []int64 to the logger context.
func (c Context) Ints64(key string, i []int64) Context { func (c Context) Ints64(key string, i []int64) Context {
c.l.context = appendInts64(appendKey(c.l.context, key), i) c.l.context = enc.AppendInts64(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uint adds the field key with i as a uint to the logger context. // Uint adds the field key with i as a uint to the logger context.
func (c Context) Uint(key string, i uint) Context { func (c Context) Uint(key string, i uint) Context {
c.l.context = appendUint(appendKey(c.l.context, key), i) c.l.context = enc.AppendUint(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uints adds the field key with i as a []uint to the logger context. // Uints adds the field key with i as a []uint to the logger context.
func (c Context) Uints(key string, i []uint) Context { func (c Context) Uints(key string, i []uint) Context {
c.l.context = appendUints(appendKey(c.l.context, key), i) c.l.context = enc.AppendUints(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uint8 adds the field key with i as a uint8 to the logger context. // Uint8 adds the field key with i as a uint8 to the logger context.
func (c Context) Uint8(key string, i uint8) Context { func (c Context) Uint8(key string, i uint8) Context {
c.l.context = appendUint8(appendKey(c.l.context, key), i) c.l.context = enc.AppendUint8(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uints8 adds the field key with i as a []uint8 to the logger context. // Uints8 adds the field key with i as a []uint8 to the logger context.
func (c Context) Uints8(key string, i []uint8) Context { func (c Context) Uints8(key string, i []uint8) Context {
c.l.context = appendUints8(appendKey(c.l.context, key), i) c.l.context = enc.AppendUints8(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uint16 adds the field key with i as a uint16 to the logger context. // Uint16 adds the field key with i as a uint16 to the logger context.
func (c Context) Uint16(key string, i uint16) Context { func (c Context) Uint16(key string, i uint16) Context {
c.l.context = appendUint16(appendKey(c.l.context, key), i) c.l.context = enc.AppendUint16(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uints16 adds the field key with i as a []uint16 to the logger context. // Uints16 adds the field key with i as a []uint16 to the logger context.
func (c Context) Uints16(key string, i []uint16) Context { func (c Context) Uints16(key string, i []uint16) Context {
c.l.context = appendUints16(appendKey(c.l.context, key), i) c.l.context = enc.AppendUints16(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uint32 adds the field key with i as a uint32 to the logger context. // Uint32 adds the field key with i as a uint32 to the logger context.
func (c Context) Uint32(key string, i uint32) Context { func (c Context) Uint32(key string, i uint32) Context {
c.l.context = appendUint32(appendKey(c.l.context, key), i) c.l.context = enc.AppendUint32(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uints32 adds the field key with i as a []uint32 to the logger context. // Uints32 adds the field key with i as a []uint32 to the logger context.
func (c Context) Uints32(key string, i []uint32) Context { func (c Context) Uints32(key string, i []uint32) Context {
c.l.context = appendUints32(appendKey(c.l.context, key), i) c.l.context = enc.AppendUints32(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uint64 adds the field key with i as a uint64 to the logger context. // Uint64 adds the field key with i as a uint64 to the logger context.
func (c Context) Uint64(key string, i uint64) Context { func (c Context) Uint64(key string, i uint64) Context {
c.l.context = appendUint64(appendKey(c.l.context, key), i) c.l.context = enc.AppendUint64(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Uints64 adds the field key with i as a []uint64 to the logger context. // Uints64 adds the field key with i as a []uint64 to the logger context.
func (c Context) Uints64(key string, i []uint64) Context { func (c Context) Uints64(key string, i []uint64) Context {
c.l.context = appendUints64(appendKey(c.l.context, key), i) c.l.context = enc.AppendUints64(enc.AppendKey(c.l.context, key), i)
return c return c
} }
// Float32 adds the field key with f as a float32 to the logger context. // Float32 adds the field key with f as a float32 to the logger context.
func (c Context) Float32(key string, f float32) Context { func (c Context) Float32(key string, f float32) Context {
c.l.context = appendFloat32(appendKey(c.l.context, key), f) c.l.context = enc.AppendFloat32(enc.AppendKey(c.l.context, key), f)
return c return c
} }
// Floats32 adds the field key with f as a []float32 to the logger context. // Floats32 adds the field key with f as a []float32 to the logger context.
func (c Context) Floats32(key string, f []float32) Context { func (c Context) Floats32(key string, f []float32) Context {
c.l.context = appendFloats32(appendKey(c.l.context, key), f) c.l.context = enc.AppendFloats32(enc.AppendKey(c.l.context, key), f)
return c return c
} }
// Float64 adds the field key with f as a float64 to the logger context. // Float64 adds the field key with f as a float64 to the logger context.
func (c Context) Float64(key string, f float64) Context { func (c Context) Float64(key string, f float64) Context {
c.l.context = appendFloat64(appendKey(c.l.context, key), f) c.l.context = enc.AppendFloat64(enc.AppendKey(c.l.context, key), f)
return c return c
} }
// Floats64 adds the field key with f as a []float64 to the logger context. // Floats64 adds the field key with f as a []float64 to the logger context.
func (c Context) Floats64(key string, f []float64) Context { func (c Context) Floats64(key string, f []float64) Context {
c.l.context = appendFloats64(appendKey(c.l.context, key), f) c.l.context = enc.AppendFloats64(enc.AppendKey(c.l.context, key), f)
return c return c
} }
@ -290,31 +290,31 @@ func (c Context) Timestamp() Context {
// Time adds the field key with t formated as string using zerolog.TimeFieldFormat. // Time adds the field key with t formated as string using zerolog.TimeFieldFormat.
func (c Context) Time(key string, t time.Time) Context { func (c Context) Time(key string, t time.Time) Context {
c.l.context = appendTime(appendKey(c.l.context, key), t, TimeFieldFormat) c.l.context = enc.AppendTime(enc.AppendKey(c.l.context, key), t, TimeFieldFormat)
return c return c
} }
// Times adds the field key with t formated as string using zerolog.TimeFieldFormat. // Times adds the field key with t formated as string using zerolog.TimeFieldFormat.
func (c Context) Times(key string, t []time.Time) Context { func (c Context) Times(key string, t []time.Time) Context {
c.l.context = appendTimes(appendKey(c.l.context, key), t, TimeFieldFormat) c.l.context = enc.AppendTimes(enc.AppendKey(c.l.context, key), t, TimeFieldFormat)
return c return c
} }
// Dur adds the fields key with d divided by unit and stored as a float. // Dur adds the fields key with d divided by unit and stored as a float.
func (c Context) Dur(key string, d time.Duration) Context { func (c Context) Dur(key string, d time.Duration) Context {
c.l.context = appendDuration(appendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger) c.l.context = enc.AppendDuration(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger)
return c return c
} }
// Durs adds the fields key with d divided by unit and stored as a float. // Durs adds the fields key with d divided by unit and stored as a float.
func (c Context) Durs(key string, d []time.Duration) Context { func (c Context) Durs(key string, d []time.Duration) Context {
c.l.context = appendDurations(appendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger) c.l.context = enc.AppendDurations(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger)
return c return c
} }
// Interface adds the field key with obj marshaled using reflection. // Interface adds the field key with obj marshaled using reflection.
func (c Context) Interface(key string, i interface{}) Context { func (c Context) Interface(key string, i interface{}) Context {
c.l.context = appendInterface(appendKey(c.l.context, key), i) c.l.context = enc.AppendInterface(enc.AppendKey(c.l.context, key), i)
return c return c
} }
@ -334,18 +334,18 @@ func (c Context) Caller() Context {
// IPAddr adds IPv4 or IPv6 Address to the context // IPAddr adds IPv4 or IPv6 Address to the context
func (c Context) IPAddr(key string, ip net.IP) Context { func (c Context) IPAddr(key string, ip net.IP) Context {
c.l.context = appendIPAddr(appendKey(c.l.context, key), ip) c.l.context = enc.AppendIPAddr(enc.AppendKey(c.l.context, key), ip)
return c return c
} }
// IPPrefix adds IPv4 or IPv6 Prefix (address and mask) to the context // IPPrefix adds IPv4 or IPv6 Prefix (address and mask) to the context
func (c Context) IPPrefix(key string, pfx net.IPNet) Context { func (c Context) IPPrefix(key string, pfx net.IPNet) Context {
c.l.context = appendIPPrefix(appendKey(c.l.context, key), pfx) c.l.context = enc.AppendIPPrefix(enc.AppendKey(c.l.context, key), pfx)
return c return c
} }
// MACAddr adds MAC address to the context // MACAddr adds MAC address to the context
func (c Context) MACAddr(key string, ha net.HardwareAddr) Context { func (c Context) MACAddr(key string, ha net.HardwareAddr) Context {
c.l.context = appendMACAddr(appendKey(c.l.context, key), ha) c.l.context = enc.AppendMACAddr(enc.AppendKey(c.l.context, key), ha)
return c return c
} }

58
encoder.go Normal file
View File

@ -0,0 +1,58 @@
package zerolog
import (
"net"
"time"
)
type encoder interface {
AppendArrayDelim(dst []byte) []byte
AppendArrayEnd(dst []byte) []byte
AppendArrayStart(dst []byte) []byte
AppendBeginMarker(dst []byte) []byte
AppendBool(dst []byte, val bool) []byte
AppendBools(dst []byte, vals []bool) []byte
AppendBytes(dst, s []byte) []byte
AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte
AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte
AppendEndMarker(dst []byte) []byte
AppendError(dst []byte, err error) []byte
AppendErrors(dst []byte, errs []error) []byte
AppendFloat32(dst []byte, val float32) []byte
AppendFloat64(dst []byte, val float64) []byte
AppendFloats32(dst []byte, vals []float32) []byte
AppendFloats64(dst []byte, vals []float64) []byte
AppendHex(dst, s []byte) []byte
AppendIPAddr(dst []byte, ip net.IP) []byte
AppendIPPrefix(dst []byte, pfx net.IPNet) []byte
AppendInt(dst []byte, val int) []byte
AppendInt16(dst []byte, val int16) []byte
AppendInt32(dst []byte, val int32) []byte
AppendInt64(dst []byte, val int64) []byte
AppendInt8(dst []byte, val int8) []byte
AppendInterface(dst []byte, i interface{}) []byte
AppendInts(dst []byte, vals []int) []byte
AppendInts16(dst []byte, vals []int16) []byte
AppendInts32(dst []byte, vals []int32) []byte
AppendInts64(dst []byte, vals []int64) []byte
AppendInts8(dst []byte, vals []int8) []byte
AppendKey(dst []byte, key string) []byte
AppendLineBreak(dst []byte) []byte
AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte
AppendNil(dst []byte) []byte
AppendObjectData(dst []byte, o []byte) []byte
AppendString(dst []byte, s string) []byte
AppendStrings(dst []byte, vals []string) []byte
AppendTime(dst []byte, t time.Time, format string) []byte
AppendTimes(dst []byte, vals []time.Time, format string) []byte
AppendUint(dst []byte, val uint) []byte
AppendUint16(dst []byte, val uint16) []byte
AppendUint32(dst []byte, val uint32) []byte
AppendUint64(dst []byte, val uint64) []byte
AppendUint8(dst []byte, val uint8) []byte
AppendUints(dst []byte, vals []uint) []byte
AppendUints16(dst []byte, vals []uint16) []byte
AppendUints32(dst []byte, vals []uint32) []byte
AppendUints64(dst []byte, vals []uint64) []byte
AppendUints8(dst []byte, vals []uint8) []byte
}

View File

@ -5,203 +5,19 @@ package zerolog
// This file contains bindings to do binary encoding. // This file contains bindings to do binary encoding.
import ( import (
"net"
"time"
"github.com/rs/zerolog/internal/cbor" "github.com/rs/zerolog/internal/cbor"
) )
func appendInterface(dst []byte, i interface{}) []byte { var (
return cbor.AppendInterface(dst, i) _ encoder = (*cbor.Encoder)(nil)
}
func appendKey(dst []byte, s string) []byte { enc = cbor.Encoder{}
return cbor.AppendKey(dst, s) )
}
func appendFloats64(dst []byte, f []float64) []byte {
return cbor.AppendFloats64(dst, f)
}
func appendFloat64(dst []byte, f float64) []byte {
return cbor.AppendFloat64(dst, f)
}
func appendFloats32(dst []byte, f []float32) []byte {
return cbor.AppendFloats32(dst, f)
}
func appendFloat32(dst []byte, f float32) []byte {
return cbor.AppendFloat32(dst, f)
}
func appendUints64(dst []byte, i []uint64) []byte {
return cbor.AppendUints64(dst, i)
}
func appendUint64(dst []byte, i uint64) []byte {
return cbor.AppendUint64(dst, i)
}
func appendUints32(dst []byte, i []uint32) []byte {
return cbor.AppendUints32(dst, i)
}
func appendUint32(dst []byte, i uint32) []byte {
return cbor.AppendUint32(dst, i)
}
func appendUints16(dst []byte, i []uint16) []byte {
return cbor.AppendUints16(dst, i)
}
func appendUint16(dst []byte, i uint16) []byte {
return cbor.AppendUint16(dst, i)
}
func appendUints8(dst []byte, i []uint8) []byte {
return cbor.AppendUints8(dst, i)
}
func appendUint8(dst []byte, i uint8) []byte {
return cbor.AppendUint8(dst, i)
}
func appendUints(dst []byte, i []uint) []byte {
return cbor.AppendUints(dst, i)
}
func appendUint(dst []byte, i uint) []byte {
return cbor.AppendUint(dst, i)
}
func appendInts64(dst []byte, i []int64) []byte {
return cbor.AppendInts64(dst, i)
}
func appendInt64(dst []byte, i int64) []byte {
return cbor.AppendInt64(dst, i)
}
func appendInts32(dst []byte, i []int32) []byte {
return cbor.AppendInts32(dst, i)
}
func appendInt32(dst []byte, i int32) []byte {
return cbor.AppendInt32(dst, i)
}
func appendInts16(dst []byte, i []int16) []byte {
return cbor.AppendInts16(dst, i)
}
func appendInt16(dst []byte, i int16) []byte {
return cbor.AppendInt16(dst, i)
}
func appendInts8(dst []byte, i []int8) []byte {
return cbor.AppendInts8(dst, i)
}
func appendInt8(dst []byte, i int8) []byte {
return cbor.AppendInt8(dst, i)
}
func appendInts(dst []byte, i []int) []byte {
return cbor.AppendInts(dst, i)
}
func appendInt(dst []byte, i int) []byte {
return cbor.AppendInt(dst, i)
}
func appendBools(dst []byte, b []bool) []byte {
return cbor.AppendBools(dst, b)
}
func appendBool(dst []byte, b bool) []byte {
return cbor.AppendBool(dst, b)
}
func appendError(dst []byte, e error) []byte {
return cbor.AppendError(dst, e)
}
func appendErrors(dst []byte, e []error) []byte {
return cbor.AppendErrors(dst, e)
}
func appendString(dst []byte, s string) []byte {
return cbor.AppendString(dst, s)
}
func appendStrings(dst []byte, s []string) []byte {
return cbor.AppendStrings(dst, s)
}
func appendDuration(dst []byte, t time.Duration, d time.Duration, fmt bool) []byte {
return cbor.AppendDuration(dst, t, d, fmt)
}
func appendDurations(dst []byte, t []time.Duration, d time.Duration, fmt bool) []byte {
return cbor.AppendDurations(dst, t, d, fmt)
}
func appendTimes(dst []byte, t []time.Time, fmt string) []byte {
return cbor.AppendTimes(dst, t, fmt)
}
func appendTime(dst []byte, t time.Time, fmt string) []byte {
return cbor.AppendTime(dst, t, fmt)
}
func appendEndMarker(dst []byte) []byte {
return cbor.AppendEndMarker(dst)
}
func appendLineBreak(dst []byte) []byte {
// No line breaks needed in binary format.
return dst
}
func appendBeginMarker(dst []byte) []byte {
return cbor.AppendBeginMarker(dst)
}
func appendBytes(dst []byte, b []byte) []byte {
return cbor.AppendBytes(dst, b)
}
func appendArrayStart(dst []byte) []byte {
return cbor.AppendArrayStart(dst)
}
func appendArrayEnd(dst []byte) []byte {
return cbor.AppendArrayEnd(dst)
}
func appendArrayDelim(dst []byte) []byte {
return cbor.AppendArrayDelim(dst)
}
func appendObjectData(dst []byte, src []byte) []byte {
// Map begin character is present in the src, which
// should not be copied when appending to existing data.
return cbor.AppendObjectData(dst, src[1:])
}
func appendJSON(dst []byte, j []byte) []byte { func appendJSON(dst []byte, j []byte) []byte {
return cbor.AppendEmbeddedJSON(dst, j) return cbor.AppendEmbeddedJSON(dst, j)
} }
func appendNil(dst []byte) []byte {
return cbor.AppendNull(dst)
}
func appendHex(dst []byte, val []byte) []byte {
return cbor.AppendHex(dst, val)
}
// decodeIfBinaryToString - converts a binary formatted log msg to a // decodeIfBinaryToString - converts a binary formatted log msg to a
// JSON formatted String Log message. // JSON formatted String Log message.
func decodeIfBinaryToString(in []byte) string { func decodeIfBinaryToString(in []byte) string {
@ -212,18 +28,6 @@ func decodeObjectToStr(in []byte) string {
return cbor.DecodeObjectToStr(in) return cbor.DecodeObjectToStr(in)
} }
func appendIPAddr(dst []byte, ip net.IP) []byte {
return cbor.AppendIPAddr(dst, ip)
}
func appendIPPrefix(dst []byte, pfx net.IPNet) []byte {
return cbor.AppendIPPrefix(dst, pfx)
}
func appendMACAddr(dst []byte, ha net.HardwareAddr) []byte {
return cbor.AppendMACAddr(dst, ha)
}
// decodeIfBinaryToBytes - converts a binary formatted log msg to a // decodeIfBinaryToBytes - converts a binary formatted log msg to a
// JSON formatted Bytes Log message. // JSON formatted Bytes Log message.
func decodeIfBinaryToBytes(in []byte) []byte { func decodeIfBinaryToBytes(in []byte) []byte {

View File

@ -6,200 +6,19 @@ package zerolog
// JSON encoded byte stream. // JSON encoded byte stream.
import ( import (
"net"
"strconv"
"time"
"github.com/rs/zerolog/internal/json" "github.com/rs/zerolog/internal/json"
) )
func appendInterface(dst []byte, i interface{}) []byte { var (
return json.AppendInterface(dst, i) _ encoder = (*json.Encoder)(nil)
}
func appendKey(dst []byte, s string) []byte { enc = json.Encoder{}
return json.AppendKey(dst, s) )
}
func appendFloats64(dst []byte, f []float64) []byte {
return json.AppendFloats64(dst, f)
}
func appendFloat64(dst []byte, f float64) []byte {
return json.AppendFloat64(dst, f)
}
func appendFloats32(dst []byte, f []float32) []byte {
return json.AppendFloats32(dst, f)
}
func appendFloat32(dst []byte, f float32) []byte {
return json.AppendFloat32(dst, f)
}
func appendUints64(dst []byte, i []uint64) []byte {
return json.AppendUints64(dst, i)
}
func appendUint64(dst []byte, i uint64) []byte {
return strconv.AppendUint(dst, uint64(i), 10)
}
func appendUints32(dst []byte, i []uint32) []byte {
return json.AppendUints32(dst, i)
}
func appendUint32(dst []byte, i uint32) []byte {
return strconv.AppendUint(dst, uint64(i), 10)
}
func appendUints16(dst []byte, i []uint16) []byte {
return json.AppendUints16(dst, i)
}
func appendUint16(dst []byte, i uint16) []byte {
return strconv.AppendUint(dst, uint64(i), 10)
}
func appendUints8(dst []byte, i []uint8) []byte {
return json.AppendUints8(dst, i)
}
func appendUint8(dst []byte, i uint8) []byte {
return strconv.AppendUint(dst, uint64(i), 10)
}
func appendUints(dst []byte, i []uint) []byte {
return json.AppendUints(dst, i)
}
func appendUint(dst []byte, i uint) []byte {
return strconv.AppendUint(dst, uint64(i), 10)
}
func appendInts64(dst []byte, i []int64) []byte {
return json.AppendInts64(dst, i)
}
func appendInt64(dst []byte, i int64) []byte {
return strconv.AppendInt(dst, int64(i), 10)
}
func appendInts32(dst []byte, i []int32) []byte {
return json.AppendInts32(dst, i)
}
func appendInt32(dst []byte, i int32) []byte {
return strconv.AppendInt(dst, int64(i), 10)
}
func appendInts16(dst []byte, i []int16) []byte {
return json.AppendInts16(dst, i)
}
func appendInt16(dst []byte, i int16) []byte {
return strconv.AppendInt(dst, int64(i), 10)
}
func appendInts8(dst []byte, i []int8) []byte {
return json.AppendInts8(dst, i)
}
func appendInt8(dst []byte, i int8) []byte {
return strconv.AppendInt(dst, int64(i), 10)
}
func appendInts(dst []byte, i []int) []byte {
return json.AppendInts(dst, i)
}
func appendInt(dst []byte, i int) []byte {
return strconv.AppendInt(dst, int64(i), 10)
}
func appendBools(dst []byte, b []bool) []byte {
return json.AppendBools(dst, b)
}
func appendBool(dst []byte, b bool) []byte {
return strconv.AppendBool(dst, b)
}
func appendError(dst []byte, e error) []byte {
return json.AppendError(dst, e)
}
func appendErrors(dst []byte, e []error) []byte {
return json.AppendErrors(dst, e)
}
func appendString(dst []byte, s string) []byte {
return json.AppendString(dst, s)
}
func appendStrings(dst []byte, s []string) []byte {
return json.AppendStrings(dst, s)
}
func appendDuration(dst []byte, t time.Duration, d time.Duration, fmt bool) []byte {
return json.AppendDuration(dst, t, d, fmt)
}
func appendDurations(dst []byte, t []time.Duration, d time.Duration, fmt bool) []byte {
return json.AppendDurations(dst, t, d, fmt)
}
func appendTimes(dst []byte, t []time.Time, fmt string) []byte {
return json.AppendTimes(dst, t, fmt)
}
func appendTime(dst []byte, t time.Time, fmt string) []byte {
return json.AppendTime(dst, t, fmt)
}
func appendEndMarker(dst []byte) []byte {
return append(dst, '}')
}
func appendLineBreak(dst []byte) []byte {
return append(dst, '\n')
}
func appendBeginMarker(dst []byte) []byte {
return append(dst, '{')
}
func appendBytes(dst []byte, b []byte) []byte {
return json.AppendBytes(dst, b)
}
func appendArrayStart(dst []byte) []byte {
return append(dst, '[')
}
func appendArrayEnd(dst []byte) []byte {
return append(dst, ']')
}
func appendArrayDelim(dst []byte) []byte {
if len(dst) > 0 {
return append(dst, ',')
}
return dst
}
func appendObjectData(dst []byte, src []byte) []byte {
return json.AppendObjectData(dst, src)
}
func appendJSON(dst []byte, j []byte) []byte { func appendJSON(dst []byte, j []byte) []byte {
return append(dst, j...) return append(dst, j...)
} }
func appendNil(dst []byte) []byte {
return append(dst, "null"...)
}
func decodeIfBinaryToString(in []byte) string { func decodeIfBinaryToString(in []byte) string {
return string(in) return string(in)
} }
@ -211,19 +30,3 @@ func decodeObjectToStr(in []byte) string {
func decodeIfBinaryToBytes(in []byte) []byte { func decodeIfBinaryToBytes(in []byte) []byte {
return in return in
} }
func appendIPAddr(dst []byte, ip net.IP) []byte {
return json.AppendIPAddr(dst, ip)
}
func appendIPPrefix(dst []byte, pfx net.IPNet) []byte {
return json.AppendIPPrefix(dst, pfx)
}
func appendMACAddr(dst []byte, ha net.HardwareAddr) []byte {
return json.AppendMACAddr(dst, ha)
}
func appendHex(in []byte, val []byte) []byte {
return json.AppendHex(in, val)
}

110
event.go
View File

@ -45,7 +45,7 @@ func newEvent(w LevelWriter, level Level) *Event {
e := eventPool.Get().(*Event) e := eventPool.Get().(*Event)
e.buf = e.buf[:0] e.buf = e.buf[:0]
e.h = e.h[:0] e.h = e.h[:0]
e.buf = appendBeginMarker(e.buf) e.buf = enc.AppendBeginMarker(e.buf)
e.w = w e.w = w
e.level = level e.level = level
return e return e
@ -55,8 +55,8 @@ func (e *Event) write() (err error) {
if e == nil { if e == nil {
return nil return nil
} }
e.buf = appendEndMarker(e.buf) e.buf = enc.AppendEndMarker(e.buf)
e.buf = appendLineBreak(e.buf) e.buf = enc.AppendLineBreak(e.buf)
if e.w != nil { if e.w != nil {
_, err = e.w.WriteLevel(e.level, e.buf) _, err = e.w.WriteLevel(e.level, e.buf)
} }
@ -95,7 +95,7 @@ func (e *Event) Msg(msg string) {
} }
} }
if msg != "" { if msg != "" {
e.buf = appendString(appendKey(e.buf, MessageFieldName), msg) e.buf = enc.AppendString(enc.AppendKey(e.buf, MessageFieldName), msg)
} }
if e.done != nil { if e.done != nil {
defer e.done(msg) defer e.done(msg)
@ -131,8 +131,8 @@ func (e *Event) Dict(key string, dict *Event) *Event {
if e == nil { if e == nil {
return e return e
} }
dict.buf = appendEndMarker(dict.buf) dict.buf = enc.AppendEndMarker(dict.buf)
e.buf = append(appendKey(e.buf, key), dict.buf...) e.buf = append(enc.AppendKey(e.buf, key), dict.buf...)
eventPool.Put(dict) eventPool.Put(dict)
return e return e
} }
@ -151,7 +151,7 @@ func (e *Event) Array(key string, arr LogArrayMarshaler) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendKey(e.buf, key) e.buf = enc.AppendKey(e.buf, key)
var a *Array var a *Array
if aa, ok := arr.(*Array); ok { if aa, ok := arr.(*Array); ok {
a = aa a = aa
@ -164,9 +164,9 @@ func (e *Event) Array(key string, arr LogArrayMarshaler) *Event {
} }
func (e *Event) appendObject(obj LogObjectMarshaler) { func (e *Event) appendObject(obj LogObjectMarshaler) {
e.buf = appendBeginMarker(e.buf) e.buf = enc.AppendBeginMarker(e.buf)
obj.MarshalZerologObject(e) obj.MarshalZerologObject(e)
e.buf = appendEndMarker(e.buf) e.buf = enc.AppendEndMarker(e.buf)
} }
// Object marshals an object that implement the LogObjectMarshaler interface. // Object marshals an object that implement the LogObjectMarshaler interface.
@ -174,7 +174,7 @@ func (e *Event) Object(key string, obj LogObjectMarshaler) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendKey(e.buf, key) e.buf = enc.AppendKey(e.buf, key)
e.appendObject(obj) e.appendObject(obj)
return e return e
} }
@ -184,7 +184,7 @@ func (e *Event) Str(key, val string) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendString(appendKey(e.buf, key), val) e.buf = enc.AppendString(enc.AppendKey(e.buf, key), val)
return e return e
} }
@ -193,7 +193,7 @@ func (e *Event) Strs(key string, vals []string) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendStrings(appendKey(e.buf, key), vals) e.buf = enc.AppendStrings(enc.AppendKey(e.buf, key), vals)
return e return e
} }
@ -205,7 +205,7 @@ func (e *Event) Bytes(key string, val []byte) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendBytes(appendKey(e.buf, key), val) e.buf = enc.AppendBytes(enc.AppendKey(e.buf, key), val)
return e return e
} }
@ -214,7 +214,7 @@ func (e *Event) Hex(key string, val []byte) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendHex(appendKey(e.buf, key), val) e.buf = enc.AppendHex(enc.AppendKey(e.buf, key), val)
return e return e
} }
@ -226,7 +226,7 @@ func (e *Event) RawJSON(key string, b []byte) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendJSON(appendKey(e.buf, key), b) e.buf = appendJSON(enc.AppendKey(e.buf, key), b)
return e return e
} }
@ -237,7 +237,7 @@ func (e *Event) AnErr(key string, err error) *Event {
return e return e
} }
if err != nil { if err != nil {
e.buf = appendError(appendKey(e.buf, key), err) e.buf = enc.AppendError(enc.AppendKey(e.buf, key), err)
} }
return e return e
} }
@ -248,7 +248,7 @@ func (e *Event) Errs(key string, errs []error) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendErrors(appendKey(e.buf, key), errs) e.buf = enc.AppendErrors(enc.AppendKey(e.buf, key), errs)
return e return e
} }
@ -260,7 +260,7 @@ func (e *Event) Err(err error) *Event {
return e return e
} }
if err != nil { if err != nil {
e.buf = appendError(appendKey(e.buf, ErrorFieldName), err) e.buf = enc.AppendError(enc.AppendKey(e.buf, ErrorFieldName), err)
} }
return e return e
} }
@ -270,7 +270,7 @@ func (e *Event) Bool(key string, b bool) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendBool(appendKey(e.buf, key), b) e.buf = enc.AppendBool(enc.AppendKey(e.buf, key), b)
return e return e
} }
@ -279,7 +279,7 @@ func (e *Event) Bools(key string, b []bool) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendBools(appendKey(e.buf, key), b) e.buf = enc.AppendBools(enc.AppendKey(e.buf, key), b)
return e return e
} }
@ -288,7 +288,7 @@ func (e *Event) Int(key string, i int) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInt(appendKey(e.buf, key), i) e.buf = enc.AppendInt(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -297,7 +297,7 @@ func (e *Event) Ints(key string, i []int) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInts(appendKey(e.buf, key), i) e.buf = enc.AppendInts(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -306,7 +306,7 @@ func (e *Event) Int8(key string, i int8) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInt8(appendKey(e.buf, key), i) e.buf = enc.AppendInt8(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -315,7 +315,7 @@ func (e *Event) Ints8(key string, i []int8) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInts8(appendKey(e.buf, key), i) e.buf = enc.AppendInts8(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -324,7 +324,7 @@ func (e *Event) Int16(key string, i int16) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInt16(appendKey(e.buf, key), i) e.buf = enc.AppendInt16(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -333,7 +333,7 @@ func (e *Event) Ints16(key string, i []int16) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInts16(appendKey(e.buf, key), i) e.buf = enc.AppendInts16(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -342,7 +342,7 @@ func (e *Event) Int32(key string, i int32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInt32(appendKey(e.buf, key), i) e.buf = enc.AppendInt32(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -351,7 +351,7 @@ func (e *Event) Ints32(key string, i []int32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInts32(appendKey(e.buf, key), i) e.buf = enc.AppendInts32(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -360,7 +360,7 @@ func (e *Event) Int64(key string, i int64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInt64(appendKey(e.buf, key), i) e.buf = enc.AppendInt64(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -369,7 +369,7 @@ func (e *Event) Ints64(key string, i []int64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendInts64(appendKey(e.buf, key), i) e.buf = enc.AppendInts64(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -378,7 +378,7 @@ func (e *Event) Uint(key string, i uint) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUint(appendKey(e.buf, key), i) e.buf = enc.AppendUint(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -387,7 +387,7 @@ func (e *Event) Uints(key string, i []uint) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUints(appendKey(e.buf, key), i) e.buf = enc.AppendUints(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -396,7 +396,7 @@ func (e *Event) Uint8(key string, i uint8) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUint8(appendKey(e.buf, key), i) e.buf = enc.AppendUint8(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -405,7 +405,7 @@ func (e *Event) Uints8(key string, i []uint8) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUints8(appendKey(e.buf, key), i) e.buf = enc.AppendUints8(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -414,7 +414,7 @@ func (e *Event) Uint16(key string, i uint16) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUint16(appendKey(e.buf, key), i) e.buf = enc.AppendUint16(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -423,7 +423,7 @@ func (e *Event) Uints16(key string, i []uint16) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUints16(appendKey(e.buf, key), i) e.buf = enc.AppendUints16(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -432,7 +432,7 @@ func (e *Event) Uint32(key string, i uint32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUint32(appendKey(e.buf, key), i) e.buf = enc.AppendUint32(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -441,7 +441,7 @@ func (e *Event) Uints32(key string, i []uint32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUints32(appendKey(e.buf, key), i) e.buf = enc.AppendUints32(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -450,7 +450,7 @@ func (e *Event) Uint64(key string, i uint64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUint64(appendKey(e.buf, key), i) e.buf = enc.AppendUint64(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -459,7 +459,7 @@ func (e *Event) Uints64(key string, i []uint64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendUints64(appendKey(e.buf, key), i) e.buf = enc.AppendUints64(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -468,7 +468,7 @@ func (e *Event) Float32(key string, f float32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendFloat32(appendKey(e.buf, key), f) e.buf = enc.AppendFloat32(enc.AppendKey(e.buf, key), f)
return e return e
} }
@ -477,7 +477,7 @@ func (e *Event) Floats32(key string, f []float32) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendFloats32(appendKey(e.buf, key), f) e.buf = enc.AppendFloats32(enc.AppendKey(e.buf, key), f)
return e return e
} }
@ -486,7 +486,7 @@ func (e *Event) Float64(key string, f float64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendFloat64(appendKey(e.buf, key), f) e.buf = enc.AppendFloat64(enc.AppendKey(e.buf, key), f)
return e return e
} }
@ -495,7 +495,7 @@ func (e *Event) Floats64(key string, f []float64) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendFloats64(appendKey(e.buf, key), f) e.buf = enc.AppendFloats64(enc.AppendKey(e.buf, key), f)
return e return e
} }
@ -508,7 +508,7 @@ func (e *Event) Timestamp() *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendTime(appendKey(e.buf, TimestampFieldName), TimestampFunc(), TimeFieldFormat) e.buf = enc.AppendTime(enc.AppendKey(e.buf, TimestampFieldName), TimestampFunc(), TimeFieldFormat)
return e return e
} }
@ -517,7 +517,7 @@ func (e *Event) Time(key string, t time.Time) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendTime(appendKey(e.buf, key), t, TimeFieldFormat) e.buf = enc.AppendTime(enc.AppendKey(e.buf, key), t, TimeFieldFormat)
return e return e
} }
@ -526,7 +526,7 @@ func (e *Event) Times(key string, t []time.Time) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendTimes(appendKey(e.buf, key), t, TimeFieldFormat) e.buf = enc.AppendTimes(enc.AppendKey(e.buf, key), t, TimeFieldFormat)
return e return e
} }
@ -537,7 +537,7 @@ func (e *Event) Dur(key string, d time.Duration) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendDuration(appendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger)
return e return e
} }
@ -548,7 +548,7 @@ func (e *Event) Durs(key string, d []time.Duration) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendDurations(appendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) e.buf = enc.AppendDurations(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger)
return e return e
} }
@ -563,7 +563,7 @@ func (e *Event) TimeDiff(key string, t time.Time, start time.Time) *Event {
if t.After(start) { if t.After(start) {
d = t.Sub(start) d = t.Sub(start)
} }
e.buf = appendDuration(appendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger)
return e return e
} }
@ -575,7 +575,7 @@ func (e *Event) Interface(key string, i interface{}) *Event {
if obj, ok := i.(LogObjectMarshaler); ok { if obj, ok := i.(LogObjectMarshaler); ok {
return e.Object(key, obj) return e.Object(key, obj)
} }
e.buf = appendInterface(appendKey(e.buf, key), i) e.buf = enc.AppendInterface(enc.AppendKey(e.buf, key), i)
return e return e
} }
@ -592,7 +592,7 @@ func (e *Event) caller(skip int) *Event {
if !ok { if !ok {
return e return e
} }
e.buf = appendString(appendKey(e.buf, CallerFieldName), file+":"+strconv.Itoa(line)) e.buf = enc.AppendString(enc.AppendKey(e.buf, CallerFieldName), file+":"+strconv.Itoa(line))
return e return e
} }
@ -601,7 +601,7 @@ func (e *Event) IPAddr(key string, ip net.IP) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendIPAddr(appendKey(e.buf, key), ip) e.buf = enc.AppendIPAddr(enc.AppendKey(e.buf, key), ip)
return e return e
} }
@ -610,7 +610,7 @@ func (e *Event) IPPrefix(key string, pfx net.IPNet) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendIPPrefix(appendKey(e.buf, key), pfx) e.buf = enc.AppendIPPrefix(enc.AppendKey(e.buf, key), pfx)
return e return e
} }
@ -619,6 +619,6 @@ func (e *Event) MACAddr(key string, ha net.HardwareAddr) *Event {
if e == nil { if e == nil {
return e return e
} }
e.buf = appendMACAddr(appendKey(e.buf, key), ha) e.buf = enc.AppendMACAddr(enc.AppendKey(e.buf, key), ha)
return e return e
} }

114
fields.go
View File

@ -13,7 +13,7 @@ func appendFields(dst []byte, fields map[string]interface{}) []byte {
} }
sort.Strings(keys) sort.Strings(keys)
for _, key := range keys { for _, key := range keys {
dst = appendKey(dst, key) dst = enc.AppendKey(dst, key)
val := fields[key] val := fields[key]
if val, ok := val.(LogObjectMarshaler); ok { if val, ok := val.(LogObjectMarshaler); ok {
e := newEvent(nil, 0) e := newEvent(nil, 0)
@ -25,117 +25,117 @@ func appendFields(dst []byte, fields map[string]interface{}) []byte {
} }
switch val := val.(type) { switch val := val.(type) {
case string: case string:
dst = appendString(dst, val) dst = enc.AppendString(dst, val)
case []byte: case []byte:
dst = appendBytes(dst, val) dst = enc.AppendBytes(dst, val)
case error: case error:
dst = appendError(dst, val) dst = enc.AppendError(dst, val)
case []error: case []error:
dst = appendErrors(dst, val) dst = enc.AppendErrors(dst, val)
case bool: case bool:
dst = appendBool(dst, val) dst = enc.AppendBool(dst, val)
case int: case int:
dst = appendInt(dst, val) dst = enc.AppendInt(dst, val)
case int8: case int8:
dst = appendInt8(dst, val) dst = enc.AppendInt8(dst, val)
case int16: case int16:
dst = appendInt16(dst, val) dst = enc.AppendInt16(dst, val)
case int32: case int32:
dst = appendInt32(dst, val) dst = enc.AppendInt32(dst, val)
case int64: case int64:
dst = appendInt64(dst, val) dst = enc.AppendInt64(dst, val)
case uint: case uint:
dst = appendUint(dst, val) dst = enc.AppendUint(dst, val)
case uint8: case uint8:
dst = appendUint8(dst, val) dst = enc.AppendUint8(dst, val)
case uint16: case uint16:
dst = appendUint16(dst, val) dst = enc.AppendUint16(dst, val)
case uint32: case uint32:
dst = appendUint32(dst, val) dst = enc.AppendUint32(dst, val)
case uint64: case uint64:
dst = appendUint64(dst, val) dst = enc.AppendUint64(dst, val)
case float32: case float32:
dst = appendFloat32(dst, val) dst = enc.AppendFloat32(dst, val)
case float64: case float64:
dst = appendFloat64(dst, val) dst = enc.AppendFloat64(dst, val)
case time.Time: case time.Time:
dst = appendTime(dst, val, TimeFieldFormat) dst = enc.AppendTime(dst, val, TimeFieldFormat)
case time.Duration: case time.Duration:
dst = appendDuration(dst, val, DurationFieldUnit, DurationFieldInteger) dst = enc.AppendDuration(dst, val, DurationFieldUnit, DurationFieldInteger)
case *string: case *string:
dst = appendString(dst, *val) dst = enc.AppendString(dst, *val)
case *bool: case *bool:
dst = appendBool(dst, *val) dst = enc.AppendBool(dst, *val)
case *int: case *int:
dst = appendInt(dst, *val) dst = enc.AppendInt(dst, *val)
case *int8: case *int8:
dst = appendInt8(dst, *val) dst = enc.AppendInt8(dst, *val)
case *int16: case *int16:
dst = appendInt16(dst, *val) dst = enc.AppendInt16(dst, *val)
case *int32: case *int32:
dst = appendInt32(dst, *val) dst = enc.AppendInt32(dst, *val)
case *int64: case *int64:
dst = appendInt64(dst, *val) dst = enc.AppendInt64(dst, *val)
case *uint: case *uint:
dst = appendUint(dst, *val) dst = enc.AppendUint(dst, *val)
case *uint8: case *uint8:
dst = appendUint8(dst, *val) dst = enc.AppendUint8(dst, *val)
case *uint16: case *uint16:
dst = appendUint16(dst, *val) dst = enc.AppendUint16(dst, *val)
case *uint32: case *uint32:
dst = appendUint32(dst, *val) dst = enc.AppendUint32(dst, *val)
case *uint64: case *uint64:
dst = appendUint64(dst, *val) dst = enc.AppendUint64(dst, *val)
case *float32: case *float32:
dst = appendFloat32(dst, *val) dst = enc.AppendFloat32(dst, *val)
case *float64: case *float64:
dst = appendFloat64(dst, *val) dst = enc.AppendFloat64(dst, *val)
case *time.Time: case *time.Time:
dst = appendTime(dst, *val, TimeFieldFormat) dst = enc.AppendTime(dst, *val, TimeFieldFormat)
case *time.Duration: case *time.Duration:
dst = appendDuration(dst, *val, DurationFieldUnit, DurationFieldInteger) dst = enc.AppendDuration(dst, *val, DurationFieldUnit, DurationFieldInteger)
case []string: case []string:
dst = appendStrings(dst, val) dst = enc.AppendStrings(dst, val)
case []bool: case []bool:
dst = appendBools(dst, val) dst = enc.AppendBools(dst, val)
case []int: case []int:
dst = appendInts(dst, val) dst = enc.AppendInts(dst, val)
case []int8: case []int8:
dst = appendInts8(dst, val) dst = enc.AppendInts8(dst, val)
case []int16: case []int16:
dst = appendInts16(dst, val) dst = enc.AppendInts16(dst, val)
case []int32: case []int32:
dst = appendInts32(dst, val) dst = enc.AppendInts32(dst, val)
case []int64: case []int64:
dst = appendInts64(dst, val) dst = enc.AppendInts64(dst, val)
case []uint: case []uint:
dst = appendUints(dst, val) dst = enc.AppendUints(dst, val)
// case []uint8: // case []uint8:
// dst = appendUints8(dst, val) // dst = enc.AppendUints8(dst, val)
case []uint16: case []uint16:
dst = appendUints16(dst, val) dst = enc.AppendUints16(dst, val)
case []uint32: case []uint32:
dst = appendUints32(dst, val) dst = enc.AppendUints32(dst, val)
case []uint64: case []uint64:
dst = appendUints64(dst, val) dst = enc.AppendUints64(dst, val)
case []float32: case []float32:
dst = appendFloats32(dst, val) dst = enc.AppendFloats32(dst, val)
case []float64: case []float64:
dst = appendFloats64(dst, val) dst = enc.AppendFloats64(dst, val)
case []time.Time: case []time.Time:
dst = appendTimes(dst, val, TimeFieldFormat) dst = enc.AppendTimes(dst, val, TimeFieldFormat)
case []time.Duration: case []time.Duration:
dst = appendDurations(dst, val, DurationFieldUnit, DurationFieldInteger) dst = enc.AppendDurations(dst, val, DurationFieldUnit, DurationFieldInteger)
case nil: case nil:
dst = appendNil(dst) dst = enc.AppendNil(dst)
case net.IP: case net.IP:
dst = appendIPAddr(dst, val) dst = enc.AppendIPAddr(dst, val)
case net.IPNet: case net.IPNet:
dst = appendIPPrefix(dst, val) dst = enc.AppendIPPrefix(dst, val)
case net.HardwareAddr: case net.HardwareAddr:
dst = appendMACAddr(dst, val) dst = enc.AppendMACAddr(dst, val)
default: default:
dst = appendInterface(dst, val) dst = enc.AppendInterface(dst, val)
} }
} }
return dst return dst

View File

@ -1,43 +1,45 @@
package cbor package cbor
type Encoder struct{}
// AppendKey adds a key (string) to the binary encoded log message // AppendKey adds a key (string) to the binary encoded log message
func AppendKey(dst []byte, key string) []byte { func (e Encoder) AppendKey(dst []byte, key string) []byte {
if len(dst) < 1 { if len(dst) < 1 {
dst = AppendBeginMarker(dst) dst = e.AppendBeginMarker(dst)
} }
return AppendString(dst, key) return e.AppendString(dst, key)
} }
// AppendError adds the Error to the log message if error is NOT nil // AppendError adds the Error to the log message if error is NOT nil
func AppendError(dst []byte, err error) []byte { func (e Encoder) AppendError(dst []byte, err error) []byte {
if err == nil { if err == nil {
return append(dst, `null`...) return append(dst, `null`...)
} }
return AppendString(dst, err.Error()) return e.AppendString(dst, err.Error())
} }
// AppendErrors when given an array of errors, // AppendErrors when given an array of errors,
// adds them to the log message if a specific error is nil, then // adds them to the log message if a specific error is nil, then
// Nil is added, or else the error string is added. // Nil is added, or else the error string is added.
func AppendErrors(dst []byte, errs []error) []byte { func (e Encoder) AppendErrors(dst []byte, errs []error) []byte {
if len(errs) == 0 { if len(errs) == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
dst = AppendArrayStart(dst) dst = e.AppendArrayStart(dst)
if errs[0] != nil { if errs[0] != nil {
dst = AppendString(dst, errs[0].Error()) dst = e.AppendString(dst, errs[0].Error())
} else { } else {
dst = AppendNull(dst) dst = e.AppendNil(dst)
} }
if len(errs) > 1 { if len(errs) > 1 {
for _, err := range errs[1:] { for _, err := range errs[1:] {
if err == nil { if err == nil {
dst = AppendNull(dst) dst = e.AppendNil(dst)
continue continue
} }
dst = AppendString(dst, err.Error()) dst = e.AppendString(dst, err.Error())
} }
} }
dst = AppendArrayEnd(dst) dst = e.AppendArrayEnd(dst)
return dst return dst
} }

View File

@ -1,7 +1,7 @@
package cbor package cbor
// AppendStrings encodes and adds an array of strings to the dst byte array. // AppendStrings encodes and adds an array of strings to the dst byte array.
func AppendStrings(dst []byte, vals []string) []byte { func (e Encoder) AppendStrings(dst []byte, vals []string) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l <= additionalMax { if l <= additionalMax {
@ -11,13 +11,13 @@ func AppendStrings(dst []byte, vals []string) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendString(dst, v) dst = e.AppendString(dst, v)
} }
return dst return dst
} }
// AppendString encodes and adds a string to the dst byte array. // AppendString encodes and adds a string to the dst byte array.
func AppendString(dst []byte, s string) []byte { func (Encoder) AppendString(dst []byte, s string) []byte {
major := majorTypeUtf8String major := majorTypeUtf8String
l := len(s) l := len(s)
@ -31,7 +31,7 @@ func AppendString(dst []byte, s string) []byte {
} }
// AppendBytes encodes and adds an array of bytes to the dst byte array. // AppendBytes encodes and adds an array of bytes to the dst byte array.
func AppendBytes(dst, s []byte) []byte { func (Encoder) AppendBytes(dst, s []byte) []byte {
major := majorTypeByteString major := majorTypeByteString
l := len(s) l := len(s)
@ -45,7 +45,7 @@ func AppendBytes(dst, s []byte) []byte {
} }
// AppendEmbeddedJSON adds a tag and embeds input JSON as such. // AppendEmbeddedJSON adds a tag and embeds input JSON as such.
func AppendEmbeddedJSON(dst, s []byte) []byte { func (Encoder) AppendEmbeddedJSON(dst, s []byte) []byte {
major := majorTypeTags major := majorTypeTags
minor := additionalTypeEmbeddedJSON minor := additionalTypeEmbeddedJSON

View File

@ -59,7 +59,7 @@ var encodeByteTests = []struct {
func TestAppendString(t *testing.T) { func TestAppendString(t *testing.T) {
for _, tt := range encodeStringTests { for _, tt := range encodeStringTests {
b := AppendString([]byte{}, tt.plain) b := enc.AppendString([]byte{}, tt.plain)
if got, want := string(b), tt.binary; got != want { if got, want := string(b), tt.binary; got != want {
t.Errorf("appendString(%q) = %#q, want %#q", tt.plain, got, want) t.Errorf("appendString(%q) = %#q, want %#q", tt.plain, got, want)
} }
@ -72,7 +72,7 @@ func TestAppendString(t *testing.T) {
} }
inp := buffer.String() inp := buffer.String()
want := "\x7a\x00\x01\x11\x70" + inp want := "\x7a\x00\x01\x11\x70" + inp
b := AppendString([]byte{}, inp) b := enc.AppendString([]byte{}, inp)
if got := string(b); got != want { if got := string(b); got != want {
t.Errorf("appendString(%q) = %#q, want %#q", inp, got, want) t.Errorf("appendString(%q) = %#q, want %#q", inp, got, want)
} }
@ -80,7 +80,7 @@ func TestAppendString(t *testing.T) {
func TestAppendBytes(t *testing.T) { func TestAppendBytes(t *testing.T) {
for _, tt := range encodeByteTests { for _, tt := range encodeByteTests {
b := AppendBytes([]byte{}, tt.plain) b := enc.AppendBytes([]byte{}, tt.plain)
if got, want := string(b), tt.binary; got != want { if got, want := string(b), tt.binary; got != want {
t.Errorf("appendString(%q) = %#q, want %#q", tt.plain, got, want) t.Errorf("appendString(%q) = %#q, want %#q", tt.plain, got, want)
} }
@ -92,7 +92,7 @@ func TestAppendBytes(t *testing.T) {
inp = append(inp, byte('a')) inp = append(inp, byte('a'))
} }
want := "\x5a\x00\x01\x11\x70" + string(inp) want := "\x5a\x00\x01\x11\x70" + string(inp)
b := AppendBytes([]byte{}, inp) b := enc.AppendBytes([]byte{}, inp)
if got := string(b); got != want { if got := string(b); got != want {
t.Errorf("appendString(%q) = %#q, want %#q", inp, got, want) t.Errorf("appendString(%q) = %#q, want %#q", inp, got, want)
} }
@ -111,7 +111,7 @@ func BenchmarkAppendString(b *testing.B) {
b.Run(name, func(b *testing.B) { b.Run(name, func(b *testing.B) {
buf := make([]byte, 0, 120) buf := make([]byte, 0, 120)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = AppendString(buf, str) _ = enc.AppendString(buf, str)
} }
}) })
} }

View File

@ -21,7 +21,7 @@ func appendIntegerTimestamp(dst []byte, t time.Time) []byte {
return dst return dst
} }
func appendFloatTimestamp(dst []byte, t time.Time) []byte { func (e Encoder) appendFloatTimestamp(dst []byte, t time.Time) []byte {
major := majorTypeTags major := majorTypeTags
minor := additionalTypeTimestamp minor := additionalTypeTimestamp
dst = append(dst, byte(major|minor)) dst = append(dst, byte(major|minor))
@ -29,24 +29,24 @@ func appendFloatTimestamp(dst []byte, t time.Time) []byte {
nanos := t.Nanosecond() nanos := t.Nanosecond()
var val float64 var val float64
val = float64(secs)*1.0 + float64(nanos)*1E-9 val = float64(secs)*1.0 + float64(nanos)*1E-9
return AppendFloat64(dst, val) return e.AppendFloat64(dst, val)
} }
// AppendTime encodes and adds a timestamp to the dst byte array. // AppendTime encodes and adds a timestamp to the dst byte array.
func AppendTime(dst []byte, t time.Time, unused string) []byte { func (e Encoder) AppendTime(dst []byte, t time.Time, unused string) []byte {
utc := t.UTC() utc := t.UTC()
if utc.Nanosecond() == 0 { if utc.Nanosecond() == 0 {
return appendIntegerTimestamp(dst, utc) return appendIntegerTimestamp(dst, utc)
} }
return appendFloatTimestamp(dst, utc) return e.appendFloatTimestamp(dst, utc)
} }
// AppendTimes encodes and adds an array of timestamps to the dst byte array. // AppendTimes encodes and adds an array of timestamps to the dst byte array.
func AppendTimes(dst []byte, vals []time.Time, unused string) []byte { func (e Encoder) AppendTimes(dst []byte, vals []time.Time, unused string) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -56,7 +56,7 @@ func AppendTimes(dst []byte, vals []time.Time, unused string) []byte {
} }
for _, t := range vals { for _, t := range vals {
dst = AppendTime(dst, t, unused) dst = e.AppendTime(dst, t, unused)
} }
return dst return dst
} }
@ -64,21 +64,21 @@ func AppendTimes(dst []byte, vals []time.Time, unused string) []byte {
// AppendDuration encodes and adds a duration to the dst byte array. // AppendDuration encodes and adds a duration to the dst byte array.
// useInt field indicates whether to store the duration as seconds (integer) or // useInt field indicates whether to store the duration as seconds (integer) or
// as seconds+nanoseconds (float). // as seconds+nanoseconds (float).
func AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte { func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte {
if useInt { if useInt {
return AppendInt64(dst, int64(d/unit)) return e.AppendInt64(dst, int64(d/unit))
} }
return AppendFloat64(dst, float64(d)/float64(unit)) return e.AppendFloat64(dst, float64(d)/float64(unit))
} }
// AppendDurations encodes and adds an array of durations to the dst byte array. // AppendDurations encodes and adds an array of durations to the dst byte array.
// useInt field indicates whether to store the duration as seconds (integer) or // useInt field indicates whether to store the duration as seconds (integer) or
// as seconds+nanoseconds (float). // as seconds+nanoseconds (float).
func AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte { func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -87,7 +87,7 @@ func AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useIn
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, d := range vals { for _, d := range vals {
dst = AppendDuration(dst, d, unit, useInt) dst = e.AppendDuration(dst, d, unit, useInt)
} }
return dst return dst
} }

View File

@ -10,7 +10,7 @@ import (
func TestAppendTimeNow(t *testing.T) { func TestAppendTimeNow(t *testing.T) {
tm := time.Now() tm := time.Now()
s := AppendTime([]byte{}, tm, "unused") s := enc.AppendTime([]byte{}, tm, "unused")
got := string(s) got := string(s)
tm1 := float64(tm.Unix()) + float64(tm.Nanosecond())*1E-9 tm1 := float64(tm.Unix()) + float64(tm.Nanosecond())*1E-9
@ -43,7 +43,7 @@ func TestAppendTimePastPresentInteger(t *testing.T) {
fmt.Println("Cannot parse input", tt.txt, ".. Skipping!", err) fmt.Println("Cannot parse input", tt.txt, ".. Skipping!", err)
continue continue
} }
b := AppendTime([]byte{}, tin, "unused") b := enc.AppendTime([]byte{}, tin, "unused")
if got, want := string(b), tt.binary; got != want { if got, want := string(b), tt.binary; got != want {
t.Errorf("appendString(%s) = 0x%s, want 0x%s", tt.txt, t.Errorf("appendString(%s) = 0x%s, want 0x%s", tt.txt,
hex.EncodeToString(b), hex.EncodeToString(b),
@ -68,7 +68,7 @@ func TestAppendTimePastPresentFloat(t *testing.T) {
fmt.Println("Cannot parse input", tt.rfcStr, ".. Skipping!") fmt.Println("Cannot parse input", tt.rfcStr, ".. Skipping!")
continue continue
} }
b := AppendTime([]byte{}, tin, "unused") b := enc.AppendTime([]byte{}, tin, "unused")
if got, want := string(b), tt.out; got != want { if got, want := string(b), tt.out; got != want {
t.Errorf("appendString(%s) = 0x%s, want 0x%s", tt.rfcStr, t.Errorf("appendString(%s) = 0x%s, want 0x%s", tt.rfcStr,
hex.EncodeToString(b), hex.EncodeToString(b),
@ -92,7 +92,7 @@ func BenchmarkAppendTime(b *testing.B) {
b.Run(name, func(b *testing.B) { b.Run(name, func(b *testing.B) {
buf := make([]byte, 0, 100) buf := make([]byte, 0, 100)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = AppendTime(buf, t, "unused") _ = enc.AppendTime(buf, t, "unused")
} }
}) })
} }

View File

@ -7,23 +7,50 @@ import (
"net" "net"
) )
// AppendNull inserts a 'Nil' object into the dst byte array. // AppendNil inserts a 'Nil' object into the dst byte array.
func AppendNull(dst []byte) []byte { func (Encoder) AppendNil(dst []byte) []byte {
return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeNull)) return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeNull))
} }
// AppendBeginMarker inserts a map start into the dst byte array. // AppendBeginMarker inserts a map start into the dst byte array.
func AppendBeginMarker(dst []byte) []byte { func (Encoder) AppendBeginMarker(dst []byte) []byte {
return append(dst, byte(majorTypeMap|additionalTypeInfiniteCount)) return append(dst, byte(majorTypeMap|additionalTypeInfiniteCount))
} }
// AppendEndMarker inserts a map end into the dst byte array. // AppendEndMarker inserts a map end into the dst byte array.
func AppendEndMarker(dst []byte) []byte { func (Encoder) AppendEndMarker(dst []byte) []byte {
return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak)) return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak))
} }
// AppendObjectData takes an object in form of a byte array and appends to dst.
func (Encoder) AppendObjectData(dst []byte, o []byte) []byte {
return append(dst, o...)
}
// AppendArrayStart adds markers to indicate the start of an array.
func (Encoder) AppendArrayStart(dst []byte) []byte {
return append(dst, byte(majorTypeArray|additionalTypeInfiniteCount))
}
// AppendArrayEnd adds markers to indicate the end of an array.
func (Encoder) AppendArrayEnd(dst []byte) []byte {
return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak))
}
// AppendArrayDelim adds markers to indicate end of a particular array element.
func (Encoder) AppendArrayDelim(dst []byte) []byte {
//No delimiters needed in cbor
return dst
}
// AppendLineBreak is a noop that keep API compat with json encoder.
func (Encoder) AppendLineBreak(dst []byte) []byte {
// No line breaks needed in binary format.
return dst
}
// AppendBool encodes and inserts a boolean value into the dst byte array. // AppendBool encodes and inserts a boolean value into the dst byte array.
func AppendBool(dst []byte, val bool) []byte { func (Encoder) AppendBool(dst []byte, val bool) []byte {
b := additionalTypeBoolFalse b := additionalTypeBoolFalse
if val { if val {
b = additionalTypeBoolTrue b = additionalTypeBoolTrue
@ -32,11 +59,11 @@ func AppendBool(dst []byte, val bool) []byte {
} }
// AppendBools encodes and inserts an array of boolean values into the dst byte array. // AppendBools encodes and inserts an array of boolean values into the dst byte array.
func AppendBools(dst []byte, vals []bool) []byte { func (e Encoder) AppendBools(dst []byte, vals []bool) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -45,13 +72,13 @@ func AppendBools(dst []byte, vals []bool) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendBool(dst, v) dst = e.AppendBool(dst, v)
} }
return dst return dst
} }
// AppendInt encodes and inserts an integer value into the dst byte array. // AppendInt encodes and inserts an integer value into the dst byte array.
func AppendInt(dst []byte, val int) []byte { func (Encoder) AppendInt(dst []byte, val int) []byte {
major := majorTypeUnsignedInt major := majorTypeUnsignedInt
contentVal := val contentVal := val
if val < 0 { if val < 0 {
@ -68,11 +95,11 @@ func AppendInt(dst []byte, val int) []byte {
} }
// AppendInts encodes and inserts an array of integer values into the dst byte array. // AppendInts encodes and inserts an array of integer values into the dst byte array.
func AppendInts(dst []byte, vals []int) []byte { func (e Encoder) AppendInts(dst []byte, vals []int) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -81,22 +108,22 @@ func AppendInts(dst []byte, vals []int) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendInt(dst, v) dst = e.AppendInt(dst, v)
} }
return dst return dst
} }
// AppendInt8 encodes and inserts an int8 value into the dst byte array. // AppendInt8 encodes and inserts an int8 value into the dst byte array.
func AppendInt8(dst []byte, val int8) []byte { func (e Encoder) AppendInt8(dst []byte, val int8) []byte {
return AppendInt(dst, int(val)) return e.AppendInt(dst, int(val))
} }
// AppendInts8 encodes and inserts an array of integer values into the dst byte array. // AppendInts8 encodes and inserts an array of integer values into the dst byte array.
func AppendInts8(dst []byte, vals []int8) []byte { func (e Encoder) AppendInts8(dst []byte, vals []int8) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -105,22 +132,22 @@ func AppendInts8(dst []byte, vals []int8) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendInt(dst, int(v)) dst = e.AppendInt(dst, int(v))
} }
return dst return dst
} }
// AppendInt16 encodes and inserts a int16 value into the dst byte array. // AppendInt16 encodes and inserts a int16 value into the dst byte array.
func AppendInt16(dst []byte, val int16) []byte { func (e Encoder) AppendInt16(dst []byte, val int16) []byte {
return AppendInt(dst, int(val)) return e.AppendInt(dst, int(val))
} }
// AppendInts16 encodes and inserts an array of int16 values into the dst byte array. // AppendInts16 encodes and inserts an array of int16 values into the dst byte array.
func AppendInts16(dst []byte, vals []int16) []byte { func (e Encoder) AppendInts16(dst []byte, vals []int16) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -129,22 +156,22 @@ func AppendInts16(dst []byte, vals []int16) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendInt(dst, int(v)) dst = e.AppendInt(dst, int(v))
} }
return dst return dst
} }
// AppendInt32 encodes and inserts a int32 value into the dst byte array. // AppendInt32 encodes and inserts a int32 value into the dst byte array.
func AppendInt32(dst []byte, val int32) []byte { func (e Encoder) AppendInt32(dst []byte, val int32) []byte {
return AppendInt(dst, int(val)) return e.AppendInt(dst, int(val))
} }
// AppendInts32 encodes and inserts an array of int32 values into the dst byte array. // AppendInts32 encodes and inserts an array of int32 values into the dst byte array.
func AppendInts32(dst []byte, vals []int32) []byte { func (e Encoder) AppendInts32(dst []byte, vals []int32) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -153,13 +180,13 @@ func AppendInts32(dst []byte, vals []int32) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendInt(dst, int(v)) dst = e.AppendInt(dst, int(v))
} }
return dst return dst
} }
// AppendInt64 encodes and inserts a int64 value into the dst byte array. // AppendInt64 encodes and inserts a int64 value into the dst byte array.
func AppendInt64(dst []byte, val int64) []byte { func (Encoder) AppendInt64(dst []byte, val int64) []byte {
major := majorTypeUnsignedInt major := majorTypeUnsignedInt
contentVal := val contentVal := val
if val < 0 { if val < 0 {
@ -176,11 +203,11 @@ func AppendInt64(dst []byte, val int64) []byte {
} }
// AppendInts64 encodes and inserts an array of int64 values into the dst byte array. // AppendInts64 encodes and inserts an array of int64 values into the dst byte array.
func AppendInts64(dst []byte, vals []int64) []byte { func (e Encoder) AppendInts64(dst []byte, vals []int64) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -189,22 +216,22 @@ func AppendInts64(dst []byte, vals []int64) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendInt64(dst, v) dst = e.AppendInt64(dst, v)
} }
return dst return dst
} }
// AppendUint encodes and inserts an unsigned integer value into the dst byte array. // AppendUint encodes and inserts an unsigned integer value into the dst byte array.
func AppendUint(dst []byte, val uint) []byte { func (e Encoder) AppendUint(dst []byte, val uint) []byte {
return AppendInt64(dst, int64(val)) return e.AppendInt64(dst, int64(val))
} }
// AppendUints encodes and inserts an array of unsigned integer values into the dst byte array. // AppendUints encodes and inserts an array of unsigned integer values into the dst byte array.
func AppendUints(dst []byte, vals []uint) []byte { func (e Encoder) AppendUints(dst []byte, vals []uint) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -213,22 +240,22 @@ func AppendUints(dst []byte, vals []uint) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendUint(dst, v) dst = e.AppendUint(dst, v)
} }
return dst return dst
} }
// AppendUint8 encodes and inserts a unsigned int8 value into the dst byte array. // AppendUint8 encodes and inserts a unsigned int8 value into the dst byte array.
func AppendUint8(dst []byte, val uint8) []byte { func (e Encoder) AppendUint8(dst []byte, val uint8) []byte {
return AppendUint(dst, uint(val)) return e.AppendUint(dst, uint(val))
} }
// AppendUints8 encodes and inserts an array of uint8 values into the dst byte array. // AppendUints8 encodes and inserts an array of uint8 values into the dst byte array.
func AppendUints8(dst []byte, vals []uint8) []byte { func (e Encoder) AppendUints8(dst []byte, vals []uint8) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -237,22 +264,22 @@ func AppendUints8(dst []byte, vals []uint8) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendUint8(dst, v) dst = e.AppendUint8(dst, v)
} }
return dst return dst
} }
// AppendUint16 encodes and inserts a uint16 value into the dst byte array. // AppendUint16 encodes and inserts a uint16 value into the dst byte array.
func AppendUint16(dst []byte, val uint16) []byte { func (e Encoder) AppendUint16(dst []byte, val uint16) []byte {
return AppendUint(dst, uint(val)) return e.AppendUint(dst, uint(val))
} }
// AppendUints16 encodes and inserts an array of uint16 values into the dst byte array. // AppendUints16 encodes and inserts an array of uint16 values into the dst byte array.
func AppendUints16(dst []byte, vals []uint16) []byte { func (e Encoder) AppendUints16(dst []byte, vals []uint16) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -261,22 +288,22 @@ func AppendUints16(dst []byte, vals []uint16) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendUint16(dst, v) dst = e.AppendUint16(dst, v)
} }
return dst return dst
} }
// AppendUint32 encodes and inserts a uint32 value into the dst byte array. // AppendUint32 encodes and inserts a uint32 value into the dst byte array.
func AppendUint32(dst []byte, val uint32) []byte { func (e Encoder) AppendUint32(dst []byte, val uint32) []byte {
return AppendUint(dst, uint(val)) return e.AppendUint(dst, uint(val))
} }
// AppendUints32 encodes and inserts an array of uint32 values into the dst byte array. // AppendUints32 encodes and inserts an array of uint32 values into the dst byte array.
func AppendUints32(dst []byte, vals []uint32) []byte { func (e Encoder) AppendUints32(dst []byte, vals []uint32) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -285,13 +312,13 @@ func AppendUints32(dst []byte, vals []uint32) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendUint32(dst, v) dst = e.AppendUint32(dst, v)
} }
return dst return dst
} }
// AppendUint64 encodes and inserts a uint64 value into the dst byte array. // AppendUint64 encodes and inserts a uint64 value into the dst byte array.
func AppendUint64(dst []byte, val uint64) []byte { func (Encoder) AppendUint64(dst []byte, val uint64) []byte {
major := majorTypeUnsignedInt major := majorTypeUnsignedInt
contentVal := val contentVal := val
if contentVal <= additionalMax { if contentVal <= additionalMax {
@ -304,11 +331,11 @@ func AppendUint64(dst []byte, val uint64) []byte {
} }
// AppendUints64 encodes and inserts an array of uint64 values into the dst byte array. // AppendUints64 encodes and inserts an array of uint64 values into the dst byte array.
func AppendUints64(dst []byte, vals []uint64) []byte { func (e Encoder) AppendUints64(dst []byte, vals []uint64) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -317,13 +344,13 @@ func AppendUints64(dst []byte, vals []uint64) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendUint64(dst, v) dst = e.AppendUint64(dst, v)
} }
return dst return dst
} }
// AppendFloat32 encodes and inserts a single precision float value into the dst byte array. // AppendFloat32 encodes and inserts a single precision float value into the dst byte array.
func AppendFloat32(dst []byte, val float32) []byte { func (Encoder) AppendFloat32(dst []byte, val float32) []byte {
switch { switch {
case math.IsNaN(float64(val)): case math.IsNaN(float64(val)):
return append(dst, "\xfa\x7f\xc0\x00\x00"...) return append(dst, "\xfa\x7f\xc0\x00\x00"...)
@ -343,11 +370,11 @@ func AppendFloat32(dst []byte, val float32) []byte {
} }
// AppendFloats32 encodes and inserts an array of single precision float value into the dst byte array. // AppendFloats32 encodes and inserts an array of single precision float value into the dst byte array.
func AppendFloats32(dst []byte, vals []float32) []byte { func (e Encoder) AppendFloats32(dst []byte, vals []float32) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -356,13 +383,13 @@ func AppendFloats32(dst []byte, vals []float32) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendFloat32(dst, v) dst = e.AppendFloat32(dst, v)
} }
return dst return dst
} }
// AppendFloat64 encodes and inserts a double precision float value into the dst byte array. // AppendFloat64 encodes and inserts a double precision float value into the dst byte array.
func AppendFloat64(dst []byte, val float64) []byte { func (Encoder) AppendFloat64(dst []byte, val float64) []byte {
switch { switch {
case math.IsNaN(val): case math.IsNaN(val):
return append(dst, "\xfb\x7f\xf8\x00\x00\x00\x00\x00\x00"...) return append(dst, "\xfb\x7f\xf8\x00\x00\x00\x00\x00\x00"...)
@ -383,11 +410,11 @@ func AppendFloat64(dst []byte, val float64) []byte {
} }
// AppendFloats64 encodes and inserts an array of double precision float values into the dst byte array. // AppendFloats64 encodes and inserts an array of double precision float values into the dst byte array.
func AppendFloats64(dst []byte, vals []float64) []byte { func (e Encoder) AppendFloats64(dst []byte, vals []float64) []byte {
major := majorTypeArray major := majorTypeArray
l := len(vals) l := len(vals)
if l == 0 { if l == 0 {
return AppendArrayEnd(AppendArrayStart(dst)) return e.AppendArrayEnd(e.AppendArrayStart(dst))
} }
if l <= additionalMax { if l <= additionalMax {
lb := byte(l) lb := byte(l)
@ -396,51 +423,30 @@ func AppendFloats64(dst []byte, vals []float64) []byte {
dst = appendCborTypePrefix(dst, major, uint64(l)) dst = appendCborTypePrefix(dst, major, uint64(l))
} }
for _, v := range vals { for _, v := range vals {
dst = AppendFloat64(dst, v) dst = e.AppendFloat64(dst, v)
} }
return dst return dst
} }
// AppendInterface takes an arbitrary object and converts it to JSON and embeds it dst. // AppendInterface takes an arbitrary object and converts it to JSON and embeds it dst.
func AppendInterface(dst []byte, i interface{}) []byte { func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte {
marshaled, err := json.Marshal(i) marshaled, err := json.Marshal(i)
if err != nil { if err != nil {
return AppendString(dst, fmt.Sprintf("marshaling error: %v", err)) return e.AppendString(dst, fmt.Sprintf("marshaling error: %v", err))
} }
return AppendEmbeddedJSON(dst, marshaled) return e.AppendEmbeddedJSON(dst, marshaled)
}
// AppendObjectData takes an object in form of a byte array and appends to dst.
func AppendObjectData(dst []byte, o []byte) []byte {
return append(dst, o...)
}
// AppendArrayStart adds markers to indicate the start of an array.
func AppendArrayStart(dst []byte) []byte {
return append(dst, byte(majorTypeArray|additionalTypeInfiniteCount))
}
// AppendArrayEnd adds markers to indicate the end of an array.
func AppendArrayEnd(dst []byte) []byte {
return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak))
}
// AppendArrayDelim adds markers to indicate end of a particular array element.
func AppendArrayDelim(dst []byte) []byte {
//No delimiters needed in cbor
return dst
} }
// AppendIPAddr encodes and inserts an IP Address (IPv4 or IPv6). // AppendIPAddr encodes and inserts an IP Address (IPv4 or IPv6).
func AppendIPAddr(dst []byte, ip net.IP) []byte { func (e Encoder) AppendIPAddr(dst []byte, ip net.IP) []byte {
dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16))
dst = append(dst, byte(additionalTypeTagNetworkAddr>>8)) dst = append(dst, byte(additionalTypeTagNetworkAddr>>8))
dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff)) dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff))
return AppendBytes(dst, ip) return e.AppendBytes(dst, ip)
} }
// AppendIPPrefix encodes and inserts an IP Address Prefix (Address + Mask Length). // AppendIPPrefix encodes and inserts an IP Address Prefix (Address + Mask Length).
func AppendIPPrefix(dst []byte, pfx net.IPNet) []byte { func (e Encoder) AppendIPPrefix(dst []byte, pfx net.IPNet) []byte {
dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16))
dst = append(dst, byte(additionalTypeTagNetworkPrefix>>8)) dst = append(dst, byte(additionalTypeTagNetworkPrefix>>8))
dst = append(dst, byte(additionalTypeTagNetworkPrefix&0xff)) dst = append(dst, byte(additionalTypeTagNetworkPrefix&0xff))
@ -448,23 +454,23 @@ func AppendIPPrefix(dst []byte, pfx net.IPNet) []byte {
// Prefix is a tuple (aka MAP of 1 pair of elements) - // Prefix is a tuple (aka MAP of 1 pair of elements) -
// first element is prefix, second is mask length. // first element is prefix, second is mask length.
dst = append(dst, byte(majorTypeMap|0x1)) dst = append(dst, byte(majorTypeMap|0x1))
dst = AppendBytes(dst, pfx.IP) dst = e.AppendBytes(dst, pfx.IP)
maskLen, _ := pfx.Mask.Size() maskLen, _ := pfx.Mask.Size()
return AppendUint8(dst, uint8(maskLen)) return e.AppendUint8(dst, uint8(maskLen))
} }
// AppendMACAddr encodes and inserts an Hardware (MAC) address. // AppendMACAddr encodes and inserts an Hardware (MAC) address.
func AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte { func (e Encoder) AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte {
dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16))
dst = append(dst, byte(additionalTypeTagNetworkAddr>>8)) dst = append(dst, byte(additionalTypeTagNetworkAddr>>8))
dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff)) dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff))
return AppendBytes(dst, ha) return e.AppendBytes(dst, ha)
} }
// AppendHex adds a TAG and inserts a hex bytes as a string. // AppendHex adds a TAG and inserts a hex bytes as a string.
func AppendHex(dst []byte, val []byte) []byte { func (e Encoder) AppendHex(dst []byte, val []byte) []byte {
dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16))
dst = append(dst, byte(additionalTypeTagHexString>>8)) dst = append(dst, byte(additionalTypeTagHexString>>8))
dst = append(dst, byte(additionalTypeTagHexString&0xff)) dst = append(dst, byte(additionalTypeTagHexString&0xff))
return AppendBytes(dst, val) return e.AppendBytes(dst, val)
} }

View File

@ -6,8 +6,10 @@ import (
"testing" "testing"
) )
func TestAppendNull(t *testing.T) { var enc = Encoder{}
s := AppendNull([]byte{})
func TestAppendNil(t *testing.T) {
s := enc.AppendNil([]byte{})
got := string(s) got := string(s)
want := "\xf6" want := "\xf6"
if got != want { if got != want {
@ -27,7 +29,7 @@ var booleanTestCases = []struct {
func TestAppendBool(t *testing.T) { func TestAppendBool(t *testing.T) {
for _, tc := range booleanTestCases { for _, tc := range booleanTestCases {
s := AppendBool([]byte{}, tc.val) s := enc.AppendBool([]byte{}, tc.val)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendBool(%s)=0x%s, want: 0x%s", t.Errorf("AppendBool(%s)=0x%s, want: 0x%s",
@ -48,7 +50,7 @@ var booleanArrayTestCases = []struct {
func TestAppendBoolArray(t *testing.T) { func TestAppendBoolArray(t *testing.T) {
for _, tc := range booleanArrayTestCases { for _, tc := range booleanArrayTestCases {
s := AppendBools([]byte{}, tc.val) s := enc.AppendBools([]byte{}, tc.val)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendBools(%s)=0x%s, want: 0x%s", t.Errorf("AppendBools(%s)=0x%s, want: 0x%s",
@ -123,7 +125,7 @@ var integerTestCases = []struct {
func TestAppendInt(t *testing.T) { func TestAppendInt(t *testing.T) {
for _, tc := range integerTestCases { for _, tc := range integerTestCases {
s := AppendInt([]byte{}, tc.val) s := enc.AppendInt([]byte{}, tc.val)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendInt(0x%x)=0x%s, want: 0x%s", t.Errorf("AppendInt(0x%x)=0x%s, want: 0x%s",
@ -148,7 +150,7 @@ var integerArrayTestCases = []struct {
func TestAppendIntArray(t *testing.T) { func TestAppendIntArray(t *testing.T) {
for _, tc := range integerArrayTestCases { for _, tc := range integerArrayTestCases {
s := AppendInts([]byte{}, tc.val) s := enc.AppendInts([]byte{}, tc.val)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendInts(%s)=0x%s, want: 0x%s", t.Errorf("AppendInts(%s)=0x%s, want: 0x%s",
@ -173,7 +175,7 @@ var float32TestCases = []struct {
func TestAppendFloat32(t *testing.T) { func TestAppendFloat32(t *testing.T) {
for _, tc := range float32TestCases { for _, tc := range float32TestCases {
s := AppendFloat32([]byte{}, tc.val) s := enc.AppendFloat32([]byte{}, tc.val)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendFloat32(%f)=0x%s, want: 0x%s", t.Errorf("AppendFloat32(%f)=0x%s, want: 0x%s",
@ -196,7 +198,7 @@ var ipAddrTestCases = []struct {
func TestAppendNetworkAddr(t *testing.T) { func TestAppendNetworkAddr(t *testing.T) {
for _, tc := range ipAddrTestCases { for _, tc := range ipAddrTestCases {
s := AppendIPAddr([]byte{}, tc.ipaddr) s := enc.AppendIPAddr([]byte{}, tc.ipaddr)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendIPAddr(%s)=0x%s, want: 0x%s", t.Errorf("AppendIPAddr(%s)=0x%s, want: 0x%s",
@ -217,7 +219,7 @@ var macAddrTestCases = []struct {
func TestAppendMacAddr(t *testing.T) { func TestAppendMacAddr(t *testing.T) {
for _, tc := range macAddrTestCases { for _, tc := range macAddrTestCases {
s := AppendMACAddr([]byte{}, tc.macaddr) s := enc.AppendMACAddr([]byte{}, tc.macaddr)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendMACAddr(%s)=0x%s, want: 0x%s", t.Errorf("AppendMACAddr(%s)=0x%s, want: 0x%s",
@ -239,7 +241,7 @@ var IPPrefixTestCases = []struct {
func TestAppendIPPrefix(t *testing.T) { func TestAppendIPPrefix(t *testing.T) {
for _, tc := range IPPrefixTestCases { for _, tc := range IPPrefixTestCases {
s := AppendIPPrefix([]byte{}, tc.pfx) s := enc.AppendIPPrefix([]byte{}, tc.pfx)
got := string(s) got := string(s)
if got != tc.binary { if got != tc.binary {
t.Errorf("AppendIPPrefix(%s)=0x%s, want: 0x%s", t.Errorf("AppendIPPrefix(%s)=0x%s, want: 0x%s",
@ -272,23 +274,23 @@ func BenchmarkAppendInt(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
switch str.sz { switch str.sz {
case 0: case 0:
_ = AppendInt(buf, int(str.val)) _ = enc.AppendInt(buf, int(str.val))
case 1: case 1:
_ = AppendUint8(buf, uint8(str.val)) _ = enc.AppendUint8(buf, uint8(str.val))
case 2: case 2:
_ = AppendUint16(buf, uint16(str.val)) _ = enc.AppendUint16(buf, uint16(str.val))
case 4: case 4:
_ = AppendUint32(buf, uint32(str.val)) _ = enc.AppendUint32(buf, uint32(str.val))
case 8: case 8:
_ = AppendUint64(buf, uint64(str.val)) _ = enc.AppendUint64(buf, uint64(str.val))
case 21: case 21:
_ = AppendInt8(buf, int8(str.val)) _ = enc.AppendInt8(buf, int8(str.val))
case 22: case 22:
_ = AppendInt16(buf, int16(str.val)) _ = enc.AppendInt16(buf, int16(str.val))
case 23: case 23:
_ = AppendInt32(buf, int32(str.val)) _ = enc.AppendInt32(buf, int32(str.val))
case 24: case 24:
_ = AppendInt64(buf, int64(str.val)) _ = enc.AppendInt64(buf, int64(str.val))
} }
} }
}) })
@ -310,9 +312,9 @@ func BenchmarkAppendFloat(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
switch str.sz { switch str.sz {
case 4: case 4:
_ = AppendFloat32(buf, float32(str.val)) _ = enc.AppendFloat32(buf, float32(str.val))
case 8: case 8:
_ = AppendFloat64(buf, str.val) _ = enc.AppendFloat64(buf, str.val)
} }
} }
}) })

View File

@ -1,32 +1,34 @@
package json package json
type Encoder struct{}
// AppendKey appends a new key to the output JSON. // AppendKey appends a new key to the output JSON.
func AppendKey(dst []byte, key string) []byte { func (e Encoder) AppendKey(dst []byte, key string) []byte {
if len(dst) > 1 && dst[len(dst)-1] != '{' { if len(dst) > 1 && dst[len(dst)-1] != '{' {
dst = append(dst, ',') dst = append(dst, ',')
} }
dst = AppendString(dst, key) dst = e.AppendString(dst, key)
return append(dst, ':') return append(dst, ':')
} }
// AppendError encodes the error string to json and appends // AppendError encodes the error string to json and appends
// the encoded string to the input byte slice. // the encoded string to the input byte slice.
func AppendError(dst []byte, err error) []byte { func (e Encoder) AppendError(dst []byte, err error) []byte {
if err == nil { if err == nil {
return append(dst, `null`...) return append(dst, `null`...)
} }
return AppendString(dst, err.Error()) return e.AppendString(dst, err.Error())
} }
// AppendErrors encodes the error strings to json and // AppendErrors encodes the error strings to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendErrors(dst []byte, errs []error) []byte { func (e Encoder) AppendErrors(dst []byte, errs []error) []byte {
if len(errs) == 0 { if len(errs) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
dst = append(dst, '[') dst = append(dst, '[')
if errs[0] != nil { if errs[0] != nil {
dst = AppendString(dst, errs[0].Error()) dst = e.AppendString(dst, errs[0].Error())
} else { } else {
dst = append(dst, "null"...) dst = append(dst, "null"...)
} }
@ -36,7 +38,7 @@ func AppendErrors(dst []byte, errs []error) []byte {
dst = append(dst, ",null"...) dst = append(dst, ",null"...)
continue continue
} }
dst = AppendString(append(dst, ','), err.Error()) dst = e.AppendString(append(dst, ','), err.Error())
} }
} }
dst = append(dst, ']') dst = append(dst, ']')

View File

@ -3,7 +3,7 @@ package json
import "unicode/utf8" import "unicode/utf8"
// AppendBytes is a mirror of appendString with []byte arg // AppendBytes is a mirror of appendString with []byte arg
func AppendBytes(dst, s []byte) []byte { func (Encoder) AppendBytes(dst, s []byte) []byte {
dst = append(dst, '"') dst = append(dst, '"')
for i := 0; i < len(s); i++ { for i := 0; i < len(s); i++ {
if !noEscapeTable[s[i]] { if !noEscapeTable[s[i]] {
@ -20,7 +20,7 @@ func AppendBytes(dst, s []byte) []byte {
// //
// The operation loops though each byte and encodes it as hex using // The operation loops though each byte and encodes it as hex using
// the hex lookup table. // the hex lookup table.
func AppendHex(dst, s []byte) []byte { func (Encoder) AppendHex(dst, s []byte) []byte {
dst = append(dst, '"') dst = append(dst, '"')
for _, v := range s { for _, v := range s {
dst = append(dst, hex[v>>4], hex[v&0x0f]) dst = append(dst, hex[v>>4], hex[v&0x0f])

View File

@ -5,9 +5,11 @@ import (
"unicode" "unicode"
) )
var enc = Encoder{}
func TestAppendBytes(t *testing.T) { func TestAppendBytes(t *testing.T) {
for _, tt := range encodeStringTests { for _, tt := range encodeStringTests {
b := AppendBytes([]byte{}, []byte(tt.in)) b := enc.AppendBytes([]byte{}, []byte(tt.in))
if got, want := string(b), tt.out; got != want { if got, want := string(b), tt.out; got != want {
t.Errorf("appendBytes(%q) = %#q, want %#q", tt.in, got, want) t.Errorf("appendBytes(%q) = %#q, want %#q", tt.in, got, want)
} }
@ -16,7 +18,7 @@ func TestAppendBytes(t *testing.T) {
func TestAppendHex(t *testing.T) { func TestAppendHex(t *testing.T) {
for _, tt := range encodeHexTests { for _, tt := range encodeHexTests {
b := AppendHex([]byte{}, []byte{tt.in}) b := enc.AppendHex([]byte{}, []byte{tt.in})
if got, want := string(b), tt.out; got != want { if got, want := string(b), tt.out; got != want {
t.Errorf("appendHex(%x) = %s, want %s", tt.in, got, want) t.Errorf("appendHex(%x) = %s, want %s", tt.in, got, want)
} }
@ -32,31 +34,31 @@ func TestStringBytes(t *testing.T) {
} }
s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
enc := string(AppendString([]byte{}, s)) encStr := string(enc.AppendString([]byte{}, s))
encBytes := string(AppendBytes([]byte{}, []byte(s))) encBytes := string(enc.AppendBytes([]byte{}, []byte(s)))
if enc != encBytes { if encStr != encBytes {
i := 0 i := 0
for i < len(enc) && i < len(encBytes) && enc[i] == encBytes[i] { for i < len(encStr) && i < len(encBytes) && encStr[i] == encBytes[i] {
i++ i++
} }
enc = enc[i:] encStr = encStr[i:]
encBytes = encBytes[i:] encBytes = encBytes[i:]
i = 0 i = 0
for i < len(enc) && i < len(encBytes) && enc[len(enc)-i-1] == encBytes[len(encBytes)-i-1] { for i < len(encStr) && i < len(encBytes) && encStr[len(encStr)-i-1] == encBytes[len(encBytes)-i-1] {
i++ i++
} }
enc = enc[:len(enc)-i] encStr = encStr[:len(encStr)-i]
encBytes = encBytes[:len(encBytes)-i] encBytes = encBytes[:len(encBytes)-i]
if len(enc) > 20 { if len(encStr) > 20 {
enc = enc[:20] + "..." encStr = encStr[:20] + "..."
} }
if len(encBytes) > 20 { if len(encBytes) > 20 {
encBytes = encBytes[:20] + "..." encBytes = encBytes[:20] + "..."
} }
t.Errorf("encodings differ at %#q vs %#q", enc, encBytes) t.Errorf("encodings differ at %#q vs %#q", encStr, encBytes)
} }
} }
@ -75,7 +77,7 @@ func BenchmarkAppendBytes(b *testing.B) {
b.Run(name, func(b *testing.B) { b.Run(name, func(b *testing.B) {
buf := make([]byte, 0, 100) buf := make([]byte, 0, 100)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = AppendBytes(buf, byt) _ = enc.AppendBytes(buf, byt)
} }
}) })
} }

View File

@ -14,15 +14,15 @@ func init() {
// AppendStrings encodes the input strings to json and // AppendStrings encodes the input strings to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendStrings(dst []byte, vals []string) []byte { func (e Encoder) AppendStrings(dst []byte, vals []string) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
dst = append(dst, '[') dst = append(dst, '[')
dst = AppendString(dst, vals[0]) dst = e.AppendString(dst, vals[0])
if len(vals) > 1 { if len(vals) > 1 {
for _, val := range vals[1:] { for _, val := range vals[1:] {
dst = AppendString(append(dst, ','), val) dst = e.AppendString(append(dst, ','), val)
} }
} }
dst = append(dst, ']') dst = append(dst, ']')
@ -38,7 +38,7 @@ func AppendStrings(dst []byte, vals []string) []byte {
// entirety to the byte slice. // entirety to the byte slice.
// If we encounter a byte that does need encoding, switch up // If we encounter a byte that does need encoding, switch up
// the operation and perform a byte-by-byte read-encode-append. // the operation and perform a byte-by-byte read-encode-append.
func AppendString(dst []byte, s string) []byte { func (Encoder) AppendString(dst []byte, s string) []byte {
// Start with a double quote. // Start with a double quote.
dst = append(dst, '"') dst = append(dst, '"')
// Loop through each character in the string. // Loop through each character in the string.

View File

@ -65,7 +65,7 @@ var encodeHexTests = []struct {
func TestAppendString(t *testing.T) { func TestAppendString(t *testing.T) {
for _, tt := range encodeStringTests { for _, tt := range encodeStringTests {
b := AppendString([]byte{}, tt.in) b := enc.AppendString([]byte{}, tt.in)
if got, want := string(b), tt.out; got != want { if got, want := string(b), tt.out; got != want {
t.Errorf("appendString(%q) = %#q, want %#q", tt.in, got, want) t.Errorf("appendString(%q) = %#q, want %#q", tt.in, got, want)
} }
@ -86,7 +86,7 @@ func BenchmarkAppendString(b *testing.B) {
b.Run(name, func(b *testing.B) { b.Run(name, func(b *testing.B) {
buf := make([]byte, 0, 100) buf := make([]byte, 0, 100)
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = AppendString(buf, str) _ = enc.AppendString(buf, str)
} }
}) })
} }

View File

@ -7,16 +7,16 @@ import (
// AppendTime formats the input time with the given format // AppendTime formats the input time with the given format
// and appends the encoded string to the input byte slice. // and appends the encoded string to the input byte slice.
func AppendTime(dst []byte, t time.Time, format string) []byte { func (e Encoder) AppendTime(dst []byte, t time.Time, format string) []byte {
if format == "" { if format == "" {
return AppendInt64(dst, t.Unix()) return e.AppendInt64(dst, t.Unix())
} }
return append(t.AppendFormat(append(dst, '"'), format), '"') return append(t.AppendFormat(append(dst, '"'), format), '"')
} }
// AppendTimes converts the input times with the given format // AppendTimes converts the input times with the given format
// and appends the encoded string list to the input byte slice. // and appends the encoded string list to the input byte slice.
func AppendTimes(dst []byte, vals []time.Time, format string) []byte { func (Encoder) AppendTimes(dst []byte, vals []time.Time, format string) []byte {
if format == "" { if format == "" {
return appendUnixTimes(dst, vals) return appendUnixTimes(dst, vals)
} }
@ -51,24 +51,24 @@ func appendUnixTimes(dst []byte, vals []time.Time) []byte {
// AppendDuration formats the input duration with the given unit & format // AppendDuration formats the input duration with the given unit & format
// and appends the encoded string to the input byte slice. // and appends the encoded string to the input byte slice.
func AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte { func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte {
if useInt { if useInt {
return strconv.AppendInt(dst, int64(d/unit), 10) return strconv.AppendInt(dst, int64(d/unit), 10)
} }
return AppendFloat64(dst, float64(d)/float64(unit)) return e.AppendFloat64(dst, float64(d)/float64(unit))
} }
// AppendDurations formats the input durations with the given unit & format // AppendDurations formats the input durations with the given unit & format
// and appends the encoded string list to the input byte slice. // and appends the encoded string list to the input byte slice.
func AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte { func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
dst = append(dst, '[') dst = append(dst, '[')
dst = AppendDuration(dst, vals[0], unit, useInt) dst = e.AppendDuration(dst, vals[0], unit, useInt)
if len(vals) > 1 { if len(vals) > 1 {
for _, d := range vals[1:] { for _, d := range vals[1:] {
dst = AppendDuration(append(dst, ','), d, unit, useInt) dst = e.AppendDuration(append(dst, ','), d, unit, useInt)
} }
} }
dst = append(dst, ']') dst = append(dst, ']')

View File

@ -8,15 +8,53 @@ import (
"strconv" "strconv"
) )
// AppendNil inserts a 'Nil' object into the dst byte array.
func (Encoder) AppendNil(dst []byte) []byte {
return append(dst, "null"...)
}
// AppendBeginMarker inserts a map start into the dst byte array.
func (Encoder) AppendBeginMarker(dst []byte) []byte {
return append(dst, '{')
}
// AppendEndMarker inserts a map end into the dst byte array.
func (Encoder) AppendEndMarker(dst []byte) []byte {
return append(dst, '}')
}
// AppendLineBreak appends a line break.
func (Encoder) AppendLineBreak(dst []byte) []byte {
return append(dst, '\n')
}
// AppendArrayStart adds markers to indicate the start of an array.
func (Encoder) AppendArrayStart(dst []byte) []byte {
return append(dst, '[')
}
// AppendArrayEnd adds markers to indicate the end of an array.
func (Encoder) AppendArrayEnd(dst []byte) []byte {
return append(dst, ']')
}
// AppendArrayDelim adds markers to indicate end of a particular array element.
func (Encoder) AppendArrayDelim(dst []byte) []byte {
if len(dst) > 0 {
return append(dst, ',')
}
return dst
}
// AppendBool converts the input bool to a string and // AppendBool converts the input bool to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendBool(dst []byte, val bool) []byte { func (Encoder) AppendBool(dst []byte, val bool) []byte {
return strconv.AppendBool(dst, val) return strconv.AppendBool(dst, val)
} }
// AppendBools encodes the input bools to json and // AppendBools encodes the input bools to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendBools(dst []byte, vals []bool) []byte { func (Encoder) AppendBools(dst []byte, vals []bool) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -33,13 +71,13 @@ func AppendBools(dst []byte, vals []bool) []byte {
// AppendInt converts the input int to a string and // AppendInt converts the input int to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInt(dst []byte, val int) []byte { func (Encoder) AppendInt(dst []byte, val int) []byte {
return strconv.AppendInt(dst, int64(val), 10) return strconv.AppendInt(dst, int64(val), 10)
} }
// AppendInts encodes the input ints to json and // AppendInts encodes the input ints to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendInts(dst []byte, vals []int) []byte { func (Encoder) AppendInts(dst []byte, vals []int) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -56,13 +94,13 @@ func AppendInts(dst []byte, vals []int) []byte {
// AppendInt8 converts the input []int8 to a string and // AppendInt8 converts the input []int8 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInt8(dst []byte, val int8) []byte { func (Encoder) AppendInt8(dst []byte, val int8) []byte {
return strconv.AppendInt(dst, int64(val), 10) return strconv.AppendInt(dst, int64(val), 10)
} }
// AppendInts8 encodes the input int8s to json and // AppendInts8 encodes the input int8s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendInts8(dst []byte, vals []int8) []byte { func (Encoder) AppendInts8(dst []byte, vals []int8) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -79,13 +117,13 @@ func AppendInts8(dst []byte, vals []int8) []byte {
// AppendInt16 converts the input int16 to a string and // AppendInt16 converts the input int16 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInt16(dst []byte, val int16) []byte { func (Encoder) AppendInt16(dst []byte, val int16) []byte {
return strconv.AppendInt(dst, int64(val), 10) return strconv.AppendInt(dst, int64(val), 10)
} }
// AppendInts16 encodes the input int16s to json and // AppendInts16 encodes the input int16s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendInts16(dst []byte, vals []int16) []byte { func (Encoder) AppendInts16(dst []byte, vals []int16) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -102,13 +140,13 @@ func AppendInts16(dst []byte, vals []int16) []byte {
// AppendInt32 converts the input int32 to a string and // AppendInt32 converts the input int32 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInt32(dst []byte, val int32) []byte { func (Encoder) AppendInt32(dst []byte, val int32) []byte {
return strconv.AppendInt(dst, int64(val), 10) return strconv.AppendInt(dst, int64(val), 10)
} }
// AppendInts32 encodes the input int32s to json and // AppendInts32 encodes the input int32s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendInts32(dst []byte, vals []int32) []byte { func (Encoder) AppendInts32(dst []byte, vals []int32) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -125,13 +163,13 @@ func AppendInts32(dst []byte, vals []int32) []byte {
// AppendInt64 converts the input int64 to a string and // AppendInt64 converts the input int64 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInt64(dst []byte, val int64) []byte { func (Encoder) AppendInt64(dst []byte, val int64) []byte {
return strconv.AppendInt(dst, val, 10) return strconv.AppendInt(dst, val, 10)
} }
// AppendInts64 encodes the input int64s to json and // AppendInts64 encodes the input int64s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendInts64(dst []byte, vals []int64) []byte { func (Encoder) AppendInts64(dst []byte, vals []int64) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -148,13 +186,13 @@ func AppendInts64(dst []byte, vals []int64) []byte {
// AppendUint converts the input uint to a string and // AppendUint converts the input uint to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendUint(dst []byte, val uint) []byte { func (Encoder) AppendUint(dst []byte, val uint) []byte {
return strconv.AppendUint(dst, uint64(val), 10) return strconv.AppendUint(dst, uint64(val), 10)
} }
// AppendUints encodes the input uints to json and // AppendUints encodes the input uints to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendUints(dst []byte, vals []uint) []byte { func (Encoder) AppendUints(dst []byte, vals []uint) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -171,13 +209,13 @@ func AppendUints(dst []byte, vals []uint) []byte {
// AppendUint8 converts the input uint8 to a string and // AppendUint8 converts the input uint8 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendUint8(dst []byte, val uint8) []byte { func (Encoder) AppendUint8(dst []byte, val uint8) []byte {
return strconv.AppendUint(dst, uint64(val), 10) return strconv.AppendUint(dst, uint64(val), 10)
} }
// AppendUints8 encodes the input uint8s to json and // AppendUints8 encodes the input uint8s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendUints8(dst []byte, vals []uint8) []byte { func (Encoder) AppendUints8(dst []byte, vals []uint8) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -194,13 +232,13 @@ func AppendUints8(dst []byte, vals []uint8) []byte {
// AppendUint16 converts the input uint16 to a string and // AppendUint16 converts the input uint16 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendUint16(dst []byte, val uint16) []byte { func (Encoder) AppendUint16(dst []byte, val uint16) []byte {
return strconv.AppendUint(dst, uint64(val), 10) return strconv.AppendUint(dst, uint64(val), 10)
} }
// AppendUints16 encodes the input uint16s to json and // AppendUints16 encodes the input uint16s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendUints16(dst []byte, vals []uint16) []byte { func (Encoder) AppendUints16(dst []byte, vals []uint16) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -217,13 +255,13 @@ func AppendUints16(dst []byte, vals []uint16) []byte {
// AppendUint32 converts the input uint32 to a string and // AppendUint32 converts the input uint32 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendUint32(dst []byte, val uint32) []byte { func (Encoder) AppendUint32(dst []byte, val uint32) []byte {
return strconv.AppendUint(dst, uint64(val), 10) return strconv.AppendUint(dst, uint64(val), 10)
} }
// AppendUints32 encodes the input uint32s to json and // AppendUints32 encodes the input uint32s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendUints32(dst []byte, vals []uint32) []byte { func (Encoder) AppendUints32(dst []byte, vals []uint32) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -240,13 +278,13 @@ func AppendUints32(dst []byte, vals []uint32) []byte {
// AppendUint64 converts the input uint64 to a string and // AppendUint64 converts the input uint64 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendUint64(dst []byte, val uint64) []byte { func (Encoder) AppendUint64(dst []byte, val uint64) []byte {
return strconv.AppendUint(dst, uint64(val), 10) return strconv.AppendUint(dst, uint64(val), 10)
} }
// AppendUints64 encodes the input uint64s to json and // AppendUints64 encodes the input uint64s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendUints64(dst []byte, vals []uint64) []byte { func (Encoder) AppendUints64(dst []byte, vals []uint64) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
@ -261,9 +299,7 @@ func AppendUints64(dst []byte, vals []uint64) []byte {
return dst return dst
} }
// AppendFloat converts the input float to a string and func appendFloat(dst []byte, val float64, bitSize int) []byte {
// appends the encoded string to the input byte slice.
func AppendFloat(dst []byte, val float64, bitSize int) []byte {
// JSON does not permit NaN or Infinity. A typical JSON encoder would fail // JSON does not permit NaN or Infinity. A typical JSON encoder would fail
// with an error, but a logging library wants the data to get thru so we // with an error, but a logging library wants the data to get thru so we
// make a tradeoff and store those types as string. // make a tradeoff and store those types as string.
@ -280,21 +316,21 @@ func AppendFloat(dst []byte, val float64, bitSize int) []byte {
// AppendFloat32 converts the input float32 to a string and // AppendFloat32 converts the input float32 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendFloat32(dst []byte, val float32) []byte { func (Encoder) AppendFloat32(dst []byte, val float32) []byte {
return AppendFloat(dst, float64(val), 32) return appendFloat(dst, float64(val), 32)
} }
// AppendFloats32 encodes the input float32s to json and // AppendFloats32 encodes the input float32s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendFloats32(dst []byte, vals []float32) []byte { func (Encoder) AppendFloats32(dst []byte, vals []float32) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
dst = append(dst, '[') dst = append(dst, '[')
dst = AppendFloat(dst, float64(vals[0]), 32) dst = appendFloat(dst, float64(vals[0]), 32)
if len(vals) > 1 { if len(vals) > 1 {
for _, val := range vals[1:] { for _, val := range vals[1:] {
dst = AppendFloat(append(dst, ','), float64(val), 32) dst = appendFloat(append(dst, ','), float64(val), 32)
} }
} }
dst = append(dst, ']') dst = append(dst, ']')
@ -303,21 +339,21 @@ func AppendFloats32(dst []byte, vals []float32) []byte {
// AppendFloat64 converts the input float64 to a string and // AppendFloat64 converts the input float64 to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendFloat64(dst []byte, val float64) []byte { func (Encoder) AppendFloat64(dst []byte, val float64) []byte {
return AppendFloat(dst, val, 64) return appendFloat(dst, val, 64)
} }
// AppendFloats64 encodes the input float64s to json and // AppendFloats64 encodes the input float64s to json and
// appends the encoded string list to the input byte slice. // appends the encoded string list to the input byte slice.
func AppendFloats64(dst []byte, vals []float64) []byte { func (Encoder) AppendFloats64(dst []byte, vals []float64) []byte {
if len(vals) == 0 { if len(vals) == 0 {
return append(dst, '[', ']') return append(dst, '[', ']')
} }
dst = append(dst, '[') dst = append(dst, '[')
dst = AppendFloat(dst, vals[0], 32) dst = appendFloat(dst, vals[0], 32)
if len(vals) > 1 { if len(vals) > 1 {
for _, val := range vals[1:] { for _, val := range vals[1:] {
dst = AppendFloat(append(dst, ','), val, 64) dst = appendFloat(append(dst, ','), val, 64)
} }
} }
dst = append(dst, ']') dst = append(dst, ']')
@ -326,17 +362,17 @@ func AppendFloats64(dst []byte, vals []float64) []byte {
// AppendInterface marshals the input interface to a string and // AppendInterface marshals the input interface to a string and
// appends the encoded string to the input byte slice. // appends the encoded string to the input byte slice.
func AppendInterface(dst []byte, i interface{}) []byte { func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte {
marshaled, err := json.Marshal(i) marshaled, err := json.Marshal(i)
if err != nil { if err != nil {
return AppendString(dst, fmt.Sprintf("marshaling error: %v", err)) return e.AppendString(dst, fmt.Sprintf("marshaling error: %v", err))
} }
return append(dst, marshaled...) return append(dst, marshaled...)
} }
// AppendObjectData takes in an object that is already in a byte array // AppendObjectData takes in an object that is already in a byte array
// and adds it to the dst. // and adds it to the dst.
func AppendObjectData(dst []byte, o []byte) []byte { func (Encoder) AppendObjectData(dst []byte, o []byte) []byte {
// Two conditions we want to put a ',' between existing content and // Two conditions we want to put a ',' between existing content and
// new content: // new content:
// 1. new content starts with '{' - which shd be dropped OR // 1. new content starts with '{' - which shd be dropped OR
@ -350,17 +386,17 @@ func AppendObjectData(dst []byte, o []byte) []byte {
} }
// AppendIPAddr adds IPv4 or IPv6 address to dst. // AppendIPAddr adds IPv4 or IPv6 address to dst.
func AppendIPAddr(dst []byte, ip net.IP) []byte { func (e Encoder) AppendIPAddr(dst []byte, ip net.IP) []byte {
return AppendString(dst, ip.String()) return e.AppendString(dst, ip.String())
} }
// AppendIPPrefix adds IPv4 or IPv6 Prefix (address & mask) to dst. // AppendIPPrefix adds IPv4 or IPv6 Prefix (address & mask) to dst.
func AppendIPPrefix(dst []byte, pfx net.IPNet) []byte { func (e Encoder) AppendIPPrefix(dst []byte, pfx net.IPNet) []byte {
return AppendString(dst, pfx.String()) return e.AppendString(dst, pfx.String())
} }
// AppendMACAddr adds MAC address to dst. // AppendMACAddr adds MAC address to dst.
func AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte { func (e Encoder) AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte {
return AppendString(dst, ha.String()) return e.AppendString(dst, ha.String())
} }

View File

@ -9,18 +9,18 @@ import (
func TestAppendType(t *testing.T) { func TestAppendType(t *testing.T) {
w := map[string]func(interface{}) []byte{ w := map[string]func(interface{}) []byte{
"AppendInt": func(v interface{}) []byte { return AppendInt([]byte{}, v.(int)) }, "AppendInt": func(v interface{}) []byte { return enc.AppendInt([]byte{}, v.(int)) },
"AppendInt8": func(v interface{}) []byte { return AppendInt8([]byte{}, v.(int8)) }, "AppendInt8": func(v interface{}) []byte { return enc.AppendInt8([]byte{}, v.(int8)) },
"AppendInt16": func(v interface{}) []byte { return AppendInt16([]byte{}, v.(int16)) }, "AppendInt16": func(v interface{}) []byte { return enc.AppendInt16([]byte{}, v.(int16)) },
"AppendInt32": func(v interface{}) []byte { return AppendInt32([]byte{}, v.(int32)) }, "AppendInt32": func(v interface{}) []byte { return enc.AppendInt32([]byte{}, v.(int32)) },
"AppendInt64": func(v interface{}) []byte { return AppendInt64([]byte{}, v.(int64)) }, "AppendInt64": func(v interface{}) []byte { return enc.AppendInt64([]byte{}, v.(int64)) },
"AppendUint": func(v interface{}) []byte { return AppendUint([]byte{}, v.(uint)) }, "AppendUint": func(v interface{}) []byte { return enc.AppendUint([]byte{}, v.(uint)) },
"AppendUint8": func(v interface{}) []byte { return AppendUint8([]byte{}, v.(uint8)) }, "AppendUint8": func(v interface{}) []byte { return enc.AppendUint8([]byte{}, v.(uint8)) },
"AppendUint16": func(v interface{}) []byte { return AppendUint16([]byte{}, v.(uint16)) }, "AppendUint16": func(v interface{}) []byte { return enc.AppendUint16([]byte{}, v.(uint16)) },
"AppendUint32": func(v interface{}) []byte { return AppendUint32([]byte{}, v.(uint32)) }, "AppendUint32": func(v interface{}) []byte { return enc.AppendUint32([]byte{}, v.(uint32)) },
"AppendUint64": func(v interface{}) []byte { return AppendUint64([]byte{}, v.(uint64)) }, "AppendUint64": func(v interface{}) []byte { return enc.AppendUint64([]byte{}, v.(uint64)) },
"AppendFloat32": func(v interface{}) []byte { return AppendFloat32([]byte{}, v.(float32)) }, "AppendFloat32": func(v interface{}) []byte { return enc.AppendFloat32([]byte{}, v.(float32)) },
"AppendFloat64": func(v interface{}) []byte { return AppendFloat64([]byte{}, v.(float64)) }, "AppendFloat64": func(v interface{}) []byte { return enc.AppendFloat64([]byte{}, v.(float64)) },
} }
tests := []struct { tests := []struct {
name string name string
@ -74,7 +74,7 @@ func Test_appendMAC(t *testing.T) {
for _, tt := range MACtests { for _, tt := range MACtests {
t.Run("MAC", func(t *testing.T) { t.Run("MAC", func(t *testing.T) {
ha, _ := net.ParseMAC(tt.input) ha, _ := net.ParseMAC(tt.input)
if got := AppendMACAddr([]byte{}, ha); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendMACAddr([]byte{}, ha); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendMACAddr() = %s, want %s", got, tt.want) t.Errorf("appendMACAddr() = %s, want %s", got, tt.want)
} }
}) })
@ -92,7 +92,7 @@ func Test_appendIP(t *testing.T) {
for _, tt := range IPv4tests { for _, tt := range IPv4tests {
t.Run("IPv4", func(t *testing.T) { t.Run("IPv4", func(t *testing.T) {
if got := AppendIPAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendIPAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendIPAddr() = %s, want %s", got, tt.want) t.Errorf("appendIPAddr() = %s, want %s", got, tt.want)
} }
}) })
@ -107,7 +107,7 @@ func Test_appendIP(t *testing.T) {
} }
for _, tt := range IPv6tests { for _, tt := range IPv6tests {
t.Run("IPv6", func(t *testing.T) { t.Run("IPv6", func(t *testing.T) {
if got := AppendIPAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendIPAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendIPAddr() = %s, want %s", got, tt.want) t.Errorf("appendIPAddr() = %s, want %s", got, tt.want)
} }
}) })
@ -124,7 +124,7 @@ func Test_appendIPPrefix(t *testing.T) {
} }
for _, tt := range IPv4Prefixtests { for _, tt := range IPv4Prefixtests {
t.Run("IPv4", func(t *testing.T) { t.Run("IPv4", func(t *testing.T) {
if got := AppendIPPrefix([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendIPPrefix([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendIPPrefix() = %s, want %s", got, tt.want) t.Errorf("appendIPPrefix() = %s, want %s", got, tt.want)
} }
}) })
@ -141,7 +141,7 @@ func Test_appendIPPrefix(t *testing.T) {
} }
for _, tt := range IPv6Prefixtests { for _, tt := range IPv6Prefixtests {
t.Run("IPv6", func(t *testing.T) { t.Run("IPv6", func(t *testing.T) {
if got := AppendIPPrefix([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendIPPrefix([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendIPPrefix() = %s, want %s", got, tt.want) t.Errorf("appendIPPrefix() = %s, want %s", got, tt.want)
} }
}) })
@ -159,7 +159,7 @@ func Test_appendMac(t *testing.T) {
for _, tt := range MACtests { for _, tt := range MACtests {
t.Run("MAC", func(t *testing.T) { t.Run("MAC", func(t *testing.T) {
if got := AppendMACAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) { if got := enc.AppendMACAddr([]byte{}, tt.input); !reflect.DeepEqual(got, tt.want) {
t.Errorf("appendMAC() = %s, want %s", got, tt.want) t.Errorf("appendMAC() = %s, want %s", got, tt.want)
} }
}) })

2
log.go
View File

@ -381,7 +381,7 @@ func (l *Logger) newEvent(level Level, done func(string)) *Event {
e.Str(LevelFieldName, level.String()) e.Str(LevelFieldName, level.String())
} }
if l.context != nil && len(l.context) > 0 { if l.context != nil && len(l.context) > 0 {
e.buf = appendObjectData(e.buf, l.context) e.buf = enc.AppendObjectData(e.buf, l.context)
} }
return e return e
} }