...

Source file src/go.uber.org/zap/zapcore/memory_encoder.go

Documentation: go.uber.org/zap/zapcore

     1  // Copyright (c) 2016 Uber Technologies, Inc.
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software.
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE.
    20  
    21  package zapcore
    22  
    23  import "time"
    24  
    25  // MapObjectEncoder is an ObjectEncoder backed by a simple
    26  // map[string]interface{}. It's not fast enough for production use, but it's
    27  // helpful in tests.
    28  type MapObjectEncoder struct {
    29  	// Fields contains the entire encoded log context.
    30  	Fields map[string]interface{}
    31  	// cur is a pointer to the namespace we're currently writing to.
    32  	cur map[string]interface{}
    33  }
    34  
    35  // NewMapObjectEncoder creates a new map-backed ObjectEncoder.
    36  func NewMapObjectEncoder() *MapObjectEncoder {
    37  	m := make(map[string]interface{})
    38  	return &MapObjectEncoder{
    39  		Fields: m,
    40  		cur:    m,
    41  	}
    42  }
    43  
    44  // AddArray implements ObjectEncoder.
    45  func (m *MapObjectEncoder) AddArray(key string, v ArrayMarshaler) error {
    46  	arr := &sliceArrayEncoder{elems: make([]interface{}, 0)}
    47  	err := v.MarshalLogArray(arr)
    48  	m.cur[key] = arr.elems
    49  	return err
    50  }
    51  
    52  // AddObject implements ObjectEncoder.
    53  func (m *MapObjectEncoder) AddObject(k string, v ObjectMarshaler) error {
    54  	newMap := NewMapObjectEncoder()
    55  	m.cur[k] = newMap.Fields
    56  	return v.MarshalLogObject(newMap)
    57  }
    58  
    59  // AddBinary implements ObjectEncoder.
    60  func (m *MapObjectEncoder) AddBinary(k string, v []byte) { m.cur[k] = v }
    61  
    62  // AddByteString implements ObjectEncoder.
    63  func (m *MapObjectEncoder) AddByteString(k string, v []byte) { m.cur[k] = string(v) }
    64  
    65  // AddBool implements ObjectEncoder.
    66  func (m *MapObjectEncoder) AddBool(k string, v bool) { m.cur[k] = v }
    67  
    68  // AddDuration implements ObjectEncoder.
    69  func (m MapObjectEncoder) AddDuration(k string, v time.Duration) { m.cur[k] = v }
    70  
    71  // AddComplex128 implements ObjectEncoder.
    72  func (m *MapObjectEncoder) AddComplex128(k string, v complex128) { m.cur[k] = v }
    73  
    74  // AddComplex64 implements ObjectEncoder.
    75  func (m *MapObjectEncoder) AddComplex64(k string, v complex64) { m.cur[k] = v }
    76  
    77  // AddFloat64 implements ObjectEncoder.
    78  func (m *MapObjectEncoder) AddFloat64(k string, v float64) { m.cur[k] = v }
    79  
    80  // AddFloat32 implements ObjectEncoder.
    81  func (m *MapObjectEncoder) AddFloat32(k string, v float32) { m.cur[k] = v }
    82  
    83  // AddInt implements ObjectEncoder.
    84  func (m *MapObjectEncoder) AddInt(k string, v int) { m.cur[k] = v }
    85  
    86  // AddInt64 implements ObjectEncoder.
    87  func (m *MapObjectEncoder) AddInt64(k string, v int64) { m.cur[k] = v }
    88  
    89  // AddInt32 implements ObjectEncoder.
    90  func (m *MapObjectEncoder) AddInt32(k string, v int32) { m.cur[k] = v }
    91  
    92  // AddInt16 implements ObjectEncoder.
    93  func (m *MapObjectEncoder) AddInt16(k string, v int16) { m.cur[k] = v }
    94  
    95  // AddInt8 implements ObjectEncoder.
    96  func (m *MapObjectEncoder) AddInt8(k string, v int8) { m.cur[k] = v }
    97  
    98  // AddString implements ObjectEncoder.
    99  func (m *MapObjectEncoder) AddString(k string, v string) { m.cur[k] = v }
   100  
   101  // AddTime implements ObjectEncoder.
   102  func (m MapObjectEncoder) AddTime(k string, v time.Time) { m.cur[k] = v }
   103  
   104  // AddUint implements ObjectEncoder.
   105  func (m *MapObjectEncoder) AddUint(k string, v uint) { m.cur[k] = v }
   106  
   107  // AddUint64 implements ObjectEncoder.
   108  func (m *MapObjectEncoder) AddUint64(k string, v uint64) { m.cur[k] = v }
   109  
   110  // AddUint32 implements ObjectEncoder.
   111  func (m *MapObjectEncoder) AddUint32(k string, v uint32) { m.cur[k] = v }
   112  
   113  // AddUint16 implements ObjectEncoder.
   114  func (m *MapObjectEncoder) AddUint16(k string, v uint16) { m.cur[k] = v }
   115  
   116  // AddUint8 implements ObjectEncoder.
   117  func (m *MapObjectEncoder) AddUint8(k string, v uint8) { m.cur[k] = v }
   118  
   119  // AddUintptr implements ObjectEncoder.
   120  func (m *MapObjectEncoder) AddUintptr(k string, v uintptr) { m.cur[k] = v }
   121  
   122  // AddReflected implements ObjectEncoder.
   123  func (m *MapObjectEncoder) AddReflected(k string, v interface{}) error {
   124  	m.cur[k] = v
   125  	return nil
   126  }
   127  
   128  // OpenNamespace implements ObjectEncoder.
   129  func (m *MapObjectEncoder) OpenNamespace(k string) {
   130  	ns := make(map[string]interface{})
   131  	m.cur[k] = ns
   132  	m.cur = ns
   133  }
   134  
   135  // sliceArrayEncoder is an ArrayEncoder backed by a simple []interface{}. Like
   136  // the MapObjectEncoder, it's not designed for production use.
   137  type sliceArrayEncoder struct {
   138  	elems []interface{}
   139  }
   140  
   141  func (s *sliceArrayEncoder) AppendArray(v ArrayMarshaler) error {
   142  	enc := &sliceArrayEncoder{}
   143  	err := v.MarshalLogArray(enc)
   144  	s.elems = append(s.elems, enc.elems)
   145  	return err
   146  }
   147  
   148  func (s *sliceArrayEncoder) AppendObject(v ObjectMarshaler) error {
   149  	m := NewMapObjectEncoder()
   150  	err := v.MarshalLogObject(m)
   151  	s.elems = append(s.elems, m.Fields)
   152  	return err
   153  }
   154  
   155  func (s *sliceArrayEncoder) AppendReflected(v interface{}) error {
   156  	s.elems = append(s.elems, v)
   157  	return nil
   158  }
   159  
   160  func (s *sliceArrayEncoder) AppendBool(v bool)              { s.elems = append(s.elems, v) }
   161  func (s *sliceArrayEncoder) AppendByteString(v []byte)      { s.elems = append(s.elems, string(v)) }
   162  func (s *sliceArrayEncoder) AppendComplex128(v complex128)  { s.elems = append(s.elems, v) }
   163  func (s *sliceArrayEncoder) AppendComplex64(v complex64)    { s.elems = append(s.elems, v) }
   164  func (s *sliceArrayEncoder) AppendDuration(v time.Duration) { s.elems = append(s.elems, v) }
   165  func (s *sliceArrayEncoder) AppendFloat64(v float64)        { s.elems = append(s.elems, v) }
   166  func (s *sliceArrayEncoder) AppendFloat32(v float32)        { s.elems = append(s.elems, v) }
   167  func (s *sliceArrayEncoder) AppendInt(v int)                { s.elems = append(s.elems, v) }
   168  func (s *sliceArrayEncoder) AppendInt64(v int64)            { s.elems = append(s.elems, v) }
   169  func (s *sliceArrayEncoder) AppendInt32(v int32)            { s.elems = append(s.elems, v) }
   170  func (s *sliceArrayEncoder) AppendInt16(v int16)            { s.elems = append(s.elems, v) }
   171  func (s *sliceArrayEncoder) AppendInt8(v int8)              { s.elems = append(s.elems, v) }
   172  func (s *sliceArrayEncoder) AppendString(v string)          { s.elems = append(s.elems, v) }
   173  func (s *sliceArrayEncoder) AppendTime(v time.Time)         { s.elems = append(s.elems, v) }
   174  func (s *sliceArrayEncoder) AppendUint(v uint)              { s.elems = append(s.elems, v) }
   175  func (s *sliceArrayEncoder) AppendUint64(v uint64)          { s.elems = append(s.elems, v) }
   176  func (s *sliceArrayEncoder) AppendUint32(v uint32)          { s.elems = append(s.elems, v) }
   177  func (s *sliceArrayEncoder) AppendUint16(v uint16)          { s.elems = append(s.elems, v) }
   178  func (s *sliceArrayEncoder) AppendUint8(v uint8)            { s.elems = append(s.elems, v) }
   179  func (s *sliceArrayEncoder) AppendUintptr(v uintptr)        { s.elems = append(s.elems, v) }
   180  

View as plain text