github.com/influx6/npkg@v0.8.8/npkg.go (about)

     1  package npkg
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  )
     7  
     8  const (
     9  	// DEBUGKey defines the key/flag name used to identify whether
    10  	// debugging mode is on.
    11  	DEBUGKey = "DEBUG"
    12  
    13  	// TRACEKey defines the key/flag name used to identify whether
    14  	// tracing is enabled.
    15  	TRACEKey = "TRACE_ENABLED"
    16  )
    17  
    18  var (
    19  	// ErrUndecodable is returned when type can not be encoded automatically.
    20  	ErrUndecodable = errors.New("value can not be decoded to and does not implement DecodableObject/List interface")
    21  )
    22  
    23  //************************************************************
    24  // Getters
    25  //************************************************************
    26  
    27  // Getter embodies what we expect from setting/configuration provider getters.
    28  type Getter interface {
    29  	Has(name string) bool
    30  
    31  	Int(string) int
    32  	Bool(string) bool
    33  	Int8(string) int8
    34  	Int16(string) int16
    35  	Int32(string) int32
    36  	Int64(string) int64
    37  	Float32(string) float32
    38  	Float64(string) float64
    39  	String(name string) string
    40  	Duration(string) time.Duration
    41  	Interface(string) interface{}
    42  }
    43  
    44  //************************************************************
    45  // Decoder
    46  //************************************************************
    47  
    48  // DecodableObject defines what we expect the a decodable type for object should provide.
    49  type DecodableObject interface {
    50  	DecodeKey(decoder Decoder, k string) error
    51  }
    52  
    53  // DecodableList defines what we expect the a decodable type for list should provide.
    54  type DecodableList interface {
    55  	DecodeIndex(decoder Decoder, index int64, total int64) error
    56  }
    57  
    58  // Decoder defines an interface for what we expect a object decoder
    59  // to provide for key value pairs.
    60  type Decoder interface {
    61  	Int(v *int) error
    62  	UInt(v *uint) error
    63  	Bool(v *bool) error
    64  	Int8(v *int8) error
    65  	Hex(v *string) error
    66  	UInt8(v *uint8) error
    67  	Int16(v *int16) error
    68  	UInt16(v *uint16) error
    69  	Int32(v *int32) error
    70  	UInt32(v *uint32) error
    71  	Int64(v *int64) error
    72  	UInt64(v *uint64) error
    73  	String(v *string) error
    74  	Float64(v *float64) error
    75  	Float32(v *float32) error
    76  	Base64(v *int64, bs int) error
    77  
    78  	List(DecodableList) error
    79  	Object(DecodableObject) error
    80  }
    81  
    82  // Decode attempts to as best as possible decode giving value in
    83  // decoder to provided interface object of matching type.
    84  // If it fails to, it returns an error.
    85  func Decode(dec Decoder, v interface{}) error {
    86  	var err error
    87  	switch vt := v.(type) {
    88  	case *string:
    89  		err = dec.String(vt)
    90  	case **string:
    91  		if vt == nil {
    92  			*vt = new(string)
    93  		}
    94  		err = dec.String(*vt)
    95  	case *int:
    96  		err = dec.Int(vt)
    97  	case **int:
    98  		if vt == nil {
    99  			*vt = new(int)
   100  		}
   101  		err = dec.Int(*vt)
   102  	case *int8:
   103  		err = dec.Int8(vt)
   104  	case **int8:
   105  		if vt == nil {
   106  			*vt = new(int8)
   107  		}
   108  		err = dec.Int8(*vt)
   109  	case *int16:
   110  		err = dec.Int16(vt)
   111  	case **int16:
   112  		if vt == nil {
   113  			*vt = new(int16)
   114  		}
   115  		err = dec.Int16(*vt)
   116  	case *int32:
   117  		err = dec.Int32(vt)
   118  	case **int32:
   119  		if vt == nil {
   120  			*vt = new(int32)
   121  		}
   122  		err = dec.Int32(*vt)
   123  	case *int64:
   124  		err = dec.Int64(vt)
   125  	case **int64:
   126  		if vt == nil {
   127  			*vt = new(int64)
   128  		}
   129  		err = dec.Int64(*vt)
   130  	case *uint8:
   131  		err = dec.UInt8(vt)
   132  	case **uint8:
   133  		if vt == nil {
   134  			*vt = new(uint8)
   135  		}
   136  		err = dec.UInt8(*vt)
   137  	case *uint16:
   138  		err = dec.UInt16(vt)
   139  	case **uint16:
   140  		if vt == nil {
   141  			*vt = new(uint16)
   142  		}
   143  		err = dec.UInt16(*vt)
   144  	case *uint32:
   145  		err = dec.UInt32(vt)
   146  	case **uint32:
   147  		if vt == nil {
   148  			*vt = new(uint32)
   149  		}
   150  		err = dec.UInt32(*vt)
   151  	case *uint64:
   152  		err = dec.UInt64(vt)
   153  	case **uint64:
   154  		if vt == nil {
   155  			*vt = new(uint64)
   156  		}
   157  		err = dec.UInt64(*vt)
   158  	case *float64:
   159  		err = dec.Float64(vt)
   160  	case **float64:
   161  		if vt == nil {
   162  			*vt = new(float64)
   163  		}
   164  		err = dec.Float64(*vt)
   165  	case *float32:
   166  		err = dec.Float32(vt)
   167  	case **float32:
   168  		if vt == nil {
   169  			*vt = new(float32)
   170  		}
   171  		err = dec.Float32(*vt)
   172  	case *bool:
   173  		err = dec.Bool(vt)
   174  	case **bool:
   175  		if vt == nil {
   176  			*vt = new(bool)
   177  		}
   178  		err = dec.Bool(*vt)
   179  	case DecodableObject:
   180  		err = dec.Object(vt)
   181  	case DecodableList:
   182  		err = dec.List(vt)
   183  	default:
   184  		err = ErrUndecodable
   185  	}
   186  	return err
   187  }
   188  
   189  type Error interface {
   190  	Err() error
   191  }
   192  
   193  // Encoder defines what we expect from a encoder of object and list elements .
   194  type Encoder interface {
   195  	Error
   196  	ObjectEncoderMethods
   197  	ListEncoderMethods
   198  }
   199  
   200  // Encodable defines a type which exposes a method to encode it's internals
   201  // with provided encoder.
   202  type Encodable interface {
   203  	Encode(encoder Encoder) error
   204  }
   205  
   206  // EncodableObject defines what we expect the a Encodable type should provide.
   207  type EncodableObject interface {
   208  	EncodeObject(encoder ObjectEncoder)
   209  }
   210  
   211  // EncodableList defines what we expect the a Encodable list type should provide.
   212  type EncodableList interface {
   213  	EncodeList(encoder ListEncoder)
   214  }
   215  
   216  // ObjectEncoder embodies what is expected from a encoding type
   217  // implementing key-value pair encoding.
   218  type ObjectEncoder interface {
   219  	Error
   220  	ObjectEncoderMethods
   221  }
   222  
   223  type ObjectEncoderMethods interface {
   224  	Int(k string, v int)
   225  	UInt(k string, v uint)
   226  	Bool(k string, v bool)
   227  	Int8(k string, v int8)
   228  	Hex(k string, v string)
   229  	UInt8(k string, v uint8)
   230  	Int16(k string, v int16)
   231  	UInt16(k string, v uint16)
   232  	Int32(k string, v int32)
   233  	UInt32(k string, v uint32)
   234  	Int64(k string, v int64)
   235  	UInt64(k string, v uint64)
   236  	String(k string, v string)
   237  	Error(k string, v error)
   238  	Bytes(k string, v []byte)
   239  	Float64(k string, v float64)
   240  	Float32(k string, v float32)
   241  	Base64(k string, v int64, b int)
   242  	Map(k string, v map[string]interface{})
   243  	StringMap(k string, v map[string]string)
   244  	Formatted(k string, format string, v interface{})
   245  
   246  	List(k string, list EncodableList)
   247  	Object(k string, object EncodableObject)
   248  	ObjectFor(k string, fx func(ObjectEncoder))
   249  	ListFor(k string, fx func(ListEncoder))
   250  }
   251  
   252  // ListEncoder defines an interface which defines methods for items into
   253  // a underline list encoding.
   254  type ListEncoder interface {
   255  	Error
   256  	ListEncoderMethods
   257  }
   258  
   259  type ListEncoderMethods interface {
   260  	AddInt(v int)
   261  	AddBool(v bool)
   262  	AddUInt(v uint)
   263  	AddInt8(v int8)
   264  	AddInt16(v int16)
   265  	AddInt32(v int32)
   266  	AddByte(v byte)
   267  	AddInt64(v int64)
   268  	AddUInt8(v uint8)
   269  	AddUInt16(v uint16)
   270  	AddUInt32(v uint32)
   271  	AddUInt64(v uint64)
   272  	AddString(v string)
   273  	AddError(v error)
   274  	AddFloat64(v float64)
   275  	AddFloat32(v float32)
   276  	AddBase64(v int64, b int)
   277  	AddMap(v map[string]interface{})
   278  	AddStringMap(v map[string]string)
   279  	AddFormatted(format string, v interface{})
   280  
   281  	AddList(list EncodableList)
   282  	AddObject(object EncodableObject)
   283  	AddObjectWith(fn func(encoder ObjectEncoder))
   284  	AddListWith(fn func(encoder ListEncoder))
   285  }
   286  
   287  // EncodeKV encodes a giving key-value pair into provided encoder based
   288  func EncodeKV(enc ObjectEncoder, k string, v interface{}) error {
   289  	switch vt := v.(type) {
   290  	case EncodableObject:
   291  		enc.Object(k, vt)
   292  	case EncodableList:
   293  		enc.List(k, vt)
   294  	case map[string]string:
   295  		enc.StringMap(k, vt)
   296  	case map[string]interface{}:
   297  		enc.Map(k, vt)
   298  	case string:
   299  		enc.String(k, vt)
   300  	case bool:
   301  		enc.Bool(k, vt)
   302  	case int:
   303  		enc.Int(k, vt)
   304  	case uint:
   305  		enc.UInt(k, vt)
   306  	case int64:
   307  		enc.Int64(k, vt)
   308  	case int32:
   309  		enc.Int32(k, vt)
   310  	case int16:
   311  		enc.Int16(k, vt)
   312  	case int8:
   313  		enc.Int8(k, vt)
   314  	case uint64:
   315  		enc.UInt64(k, vt)
   316  	case uint32:
   317  		enc.UInt32(k, vt)
   318  	case uint16:
   319  		enc.UInt16(k, vt)
   320  	case uint8:
   321  		enc.UInt8(k, vt)
   322  	case float64:
   323  		enc.Float64(k, vt)
   324  	case float32:
   325  		enc.Float32(k, vt)
   326  	case error:
   327  		enc.Error(k, vt)
   328  	}
   329  	return enc.Err()
   330  }
   331  
   332  // EncodeList encodes a giving key-value pair into provided encoder based
   333  func EncodeList(enc ListEncoder, v interface{}) error {
   334  	switch vt := v.(type) {
   335  	case EncodableObject:
   336  		enc.AddObject(vt)
   337  	case EncodableList:
   338  		enc.AddList(vt)
   339  	case map[string]string:
   340  		enc.AddStringMap(vt)
   341  	case map[string]interface{}:
   342  		enc.AddMap(vt)
   343  	case string:
   344  		enc.AddString(vt)
   345  	case bool:
   346  		enc.AddBool(vt)
   347  	case error:
   348  		enc.AddError(vt)
   349  	case int:
   350  		enc.AddInt(vt)
   351  	case uint:
   352  		enc.AddUInt(vt)
   353  	case int64:
   354  		enc.AddInt64(vt)
   355  	case int32:
   356  		enc.AddInt32(vt)
   357  	case int16:
   358  		enc.AddInt16(vt)
   359  	case int8:
   360  		enc.AddInt8(vt)
   361  	case uint64:
   362  		enc.AddUInt64(vt)
   363  	case uint32:
   364  		enc.AddUInt32(vt)
   365  	case uint16:
   366  		enc.AddUInt16(vt)
   367  	case uint8:
   368  		enc.AddUInt8(vt)
   369  	case float64:
   370  		enc.AddFloat64(vt)
   371  	case float32:
   372  		enc.AddFloat32(vt)
   373  	}
   374  	return enc.Err()
   375  }
   376  
   377  // EncodableMapList defines a map type which implements the EncodableList interface.
   378  // It attempts to encode all properties accordingly else returns an error in regard's
   379  // giving failure.
   380  type EncodableMapList []map[string]interface{}
   381  
   382  // EncodableMap implements the EncodableList interface.
   383  func (enc EncodableMapList) EncodeList(encoder ListEncoder) {
   384  	for _, value := range enc {
   385  		encoder.AddObject(EncodableMap(value))
   386  	}
   387  }
   388  
   389  type EncodedAnyList []interface{}
   390  
   391  func (enc EncodedAnyList) EncodeList(encoder ListEncoder) {
   392  	for _, value := range enc {
   393  		_ = EncodeList(encoder, value)
   394  	}
   395  }
   396  
   397  type EncodedList []string
   398  
   399  func (enc EncodedList) EncodeList(encoder ListEncoder) {
   400  	for _, value := range enc {
   401  		_ = EncodeList(encoder, value)
   402  	}
   403  }
   404  
   405  // EncodableMap defines a map type which implements the EncodableObject interface.
   406  // It attempts to encode all properties accordingly else returns an error in regard's
   407  // giving failure.
   408  type EncodableMap map[string]interface{}
   409  
   410  // EncodableMap implements the EncodableObject interface.
   411  func (enc EncodableMap) EncodeObject(encoder ObjectEncoder) {
   412  	for key, value := range enc {
   413  		_ = EncodeKV(encoder, key, value)
   414  	}
   415  }
   416  
   417  type EncodableStringListMap map[string][]string
   418  
   419  func (enc EncodableStringListMap) EncodeObject(encoder ObjectEncoder) {
   420  	for key, value := range enc {
   421  		func(k string, vals []string) {
   422  			encoder.ListFor(k, func(le ListEncoder) {
   423  				for _, val := range vals {
   424  					le.AddString(val)
   425  				}
   426  			})
   427  		}(key, value)
   428  	}
   429  }
   430  
   431  // EncodableMap defines a map type which implements the EncodableObject interface.
   432  // It attempts to encode all properties accordingly else returns an error in regard's
   433  // giving failure.
   434  type EncodableStringMap map[string]string
   435  
   436  // EncodableMap implements the EncodableObject interface.
   437  func (enc EncodableStringMap) EncodeObject(encoder ObjectEncoder) {
   438  	for key, value := range enc {
   439  		_ = EncodeKV(encoder, key, value)
   440  	}
   441  }
   442  
   443  type Encoded interface{}
   444  
   445  type EncodableObjectFunc func() Encoder
   446  
   447  type Writer interface {
   448  	Write(Encoded)
   449  }
   450  
   451  // WriteStack implements a simple chainable wrapper around the encodable object which it sends to a Writer
   452  // when New or End is called.
   453  //
   454  // It is not thread-safe to call New or End.
   455  type WriteStack struct {
   456  	writer Writer
   457  	maker  EncodableObjectFunc
   458  	base   Encoder
   459  }
   460  
   461  func NewWriteStack(fn EncodableObjectFunc, writer Writer) *WriteStack {
   462  	return &WriteStack{
   463  		writer: writer,
   464  		maker:  fn,
   465  	}
   466  }
   467  
   468  func (l *WriteStack) SetWriter(w Writer) *WriteStack {
   469  	l.writer = w
   470  	return l
   471  }
   472  
   473  func (l *WriteStack) New() *WriteStack {
   474  	l.End()
   475  	l.base = l.maker()
   476  	return l
   477  }
   478  
   479  func (l *WriteStack) End() *WriteStack {
   480  	if l.base == nil {
   481  		return l
   482  	}
   483  	l.writer.Write(l.base)
   484  	l.base = nil
   485  	return l
   486  }
   487  
   488  func (l *WriteStack) Formatted(k string, format string, v interface{}) *WriteStack {
   489  	l.base.Formatted(k, format, v)
   490  	return l
   491  }
   492  
   493  func (l *WriteStack) AddFormatted(format string, v interface{}) *WriteStack {
   494  	l.base.AddFormatted(format, v)
   495  	return l
   496  }
   497  
   498  type LogLevel int
   499  
   500  const (
   501  	DEBUG    LogLevel = 10
   502  	INFO     LogLevel = 20
   503  	ERROR    LogLevel = 40
   504  	WARN     LogLevel = 60
   505  	CRITICAL LogLevel = 80
   506  	PANIC    LogLevel = 120
   507  )
   508  
   509  func (l *WriteStack) LInfo() *WriteStack {
   510  	return l.Level(INFO)
   511  }
   512  
   513  func (l *WriteStack) LError() *WriteStack {
   514  	return l.Level(ERROR)
   515  }
   516  
   517  func (l *WriteStack) LDebug() *WriteStack {
   518  	return l.Level(DEBUG)
   519  }
   520  
   521  func (l *WriteStack) LCritical() *WriteStack {
   522  	return l.Level(CRITICAL)
   523  }
   524  
   525  func (l *WriteStack) LPanic() *WriteStack {
   526  	return l.Level(PANIC)
   527  }
   528  
   529  func (l *WriteStack) LWarn() *WriteStack {
   530  	return l.Level(WARN)
   531  }
   532  
   533  func (l *WriteStack) Level(level LogLevel) *WriteStack {
   534  	l.Int("_level", int(level))
   535  	return l
   536  }
   537  
   538  func (l *WriteStack) Message(msg string) *WriteStack {
   539  	l.String("_message", msg)
   540  	return l
   541  }
   542  
   543  func (l *WriteStack) AddInt(v int) *WriteStack {
   544  	l.base.AddInt(v)
   545  	return l
   546  }
   547  
   548  func (l *WriteStack) AddBool(v bool) *WriteStack {
   549  	l.base.AddBool(v)
   550  	return l
   551  }
   552  
   553  func (l *WriteStack) AddUInt(v uint) *WriteStack {
   554  	l.base.AddUInt(v)
   555  	return l
   556  }
   557  
   558  func (l *WriteStack) AddInt8(v int8) *WriteStack {
   559  	l.base.AddInt8(v)
   560  	return l
   561  }
   562  
   563  func (l *WriteStack) AddInt16(v int16) *WriteStack {
   564  	l.base.AddInt16(v)
   565  	return l
   566  }
   567  
   568  func (l *WriteStack) AddInt32(v int32) *WriteStack {
   569  	l.base.AddInt32(v)
   570  	return l
   571  }
   572  
   573  func (l *WriteStack) AddByte(v byte) *WriteStack {
   574  	l.base.AddByte(v)
   575  	return l
   576  }
   577  
   578  func (l *WriteStack) AddInt64(v int64) *WriteStack {
   579  	l.base.AddInt64(v)
   580  	return l
   581  }
   582  
   583  func (l *WriteStack) AddUInt8(v uint8) *WriteStack {
   584  	l.base.AddUInt8(v)
   585  	return l
   586  }
   587  
   588  func (l *WriteStack) AddUInt16(v uint16) *WriteStack {
   589  	l.base.AddUInt16(v)
   590  	return l
   591  }
   592  
   593  func (l *WriteStack) AddUInt32(v uint32) *WriteStack {
   594  	l.base.AddUInt32(v)
   595  	return l
   596  }
   597  
   598  func (l *WriteStack) AddUInt64(v uint64) *WriteStack {
   599  	l.base.AddUInt64(v)
   600  	return l
   601  }
   602  
   603  func (l *WriteStack) AddError(v error) *WriteStack {
   604  	l.base.AddError(v)
   605  	return l
   606  }
   607  
   608  func (l *WriteStack) AddString(v string) *WriteStack {
   609  	l.base.AddString(v)
   610  	return l
   611  }
   612  
   613  func (l *WriteStack) AddFloat64(v float64) *WriteStack {
   614  	l.base.AddFloat64(v)
   615  	return l
   616  }
   617  
   618  func (l *WriteStack) AddFloat32(v float32) *WriteStack {
   619  	l.base.AddFloat32(v)
   620  	return l
   621  }
   622  
   623  func (l *WriteStack) AddBase64(v int64, b int) *WriteStack {
   624  	l.base.AddBase64(v, b)
   625  	return l
   626  }
   627  
   628  func (l *WriteStack) AddMap(v map[string]interface{}) *WriteStack {
   629  	l.base.AddMap(v)
   630  	return l
   631  }
   632  
   633  func (l *WriteStack) AddStringMap(v map[string]string) *WriteStack {
   634  	l.base.AddStringMap(v)
   635  	return l
   636  }
   637  
   638  func (l *WriteStack) AddList(v EncodableList) *WriteStack {
   639  	l.base.AddList(v)
   640  	return l
   641  }
   642  
   643  func (l *WriteStack) AddObject(v EncodableObject) *WriteStack {
   644  	l.base.AddObject(v)
   645  	return l
   646  }
   647  
   648  func (l *WriteStack) AddObjectWith(fn func(encoder ObjectEncoder)) *WriteStack {
   649  	l.base.AddObjectWith(fn)
   650  	return l
   651  }
   652  
   653  func (l *WriteStack) AddListWith(fn func(encoder ListEncoder)) *WriteStack {
   654  	l.base.AddListWith(fn)
   655  	return l
   656  }
   657  
   658  func (l *WriteStack) Err() error {
   659  	if l.base == nil {
   660  		return nil
   661  	}
   662  	return l.base.Err()
   663  }
   664  
   665  func (l *WriteStack) Int(k string, v int) *WriteStack {
   666  	l.base.Int(k, v)
   667  	return l
   668  }
   669  
   670  func (l *WriteStack) UInt(k string, v uint) *WriteStack {
   671  	l.base.UInt(k, v)
   672  	return l
   673  }
   674  
   675  func (l *WriteStack) Bool(k string, v bool) *WriteStack {
   676  	l.base.Bool(k, v)
   677  	return l
   678  }
   679  
   680  func (l *WriteStack) Int8(k string, v int8) *WriteStack {
   681  	l.base.Int8(k, v)
   682  	return l
   683  }
   684  
   685  func (l *WriteStack) Hex(k string, v string) *WriteStack {
   686  	l.base.Hex(k, v)
   687  	return l
   688  }
   689  
   690  func (l *WriteStack) UInt8(k string, v uint8) *WriteStack {
   691  	l.base.UInt8(k, v)
   692  	return l
   693  }
   694  
   695  func (l *WriteStack) Int16(k string, v int16) *WriteStack {
   696  	l.base.Int16(k, v)
   697  	return l
   698  }
   699  
   700  func (l *WriteStack) UInt16(k string, v uint16) *WriteStack {
   701  	l.base.UInt16(k, v)
   702  	return l
   703  }
   704  
   705  func (l *WriteStack) Int32(k string, v int32) *WriteStack {
   706  	l.base.Int32(k, v)
   707  	return l
   708  }
   709  
   710  func (l *WriteStack) UInt32(k string, v uint32) *WriteStack {
   711  	l.base.UInt32(k, v)
   712  	return l
   713  }
   714  
   715  func (l *WriteStack) Int64(k string, v int64) *WriteStack {
   716  	l.base.Int64(k, v)
   717  	return l
   718  }
   719  
   720  func (l *WriteStack) UInt64(k string, v uint64) *WriteStack {
   721  	l.base.UInt64(k, v)
   722  	return l
   723  }
   724  
   725  func (l *WriteStack) String(k string, v string) *WriteStack {
   726  	l.base.String(k, v)
   727  	return l
   728  }
   729  
   730  func (l *WriteStack) Error(k string, v error) *WriteStack {
   731  	l.base.Error(k, v)
   732  	return l
   733  }
   734  
   735  func (l *WriteStack) Bytes(k string, v []byte) *WriteStack {
   736  	l.base.Bytes(k, v)
   737  	return l
   738  }
   739  
   740  func (l *WriteStack) Float64(k string, v float64) *WriteStack {
   741  	l.base.Float64(k, v)
   742  	return l
   743  }
   744  
   745  func (l *WriteStack) Float32(k string, v float32) *WriteStack {
   746  	l.base.Float32(k, v)
   747  	return l
   748  }
   749  
   750  func (l *WriteStack) Base64(k string, v int64, b int) *WriteStack {
   751  	l.base.Base64(k, v, b)
   752  	return l
   753  }
   754  
   755  func (l *WriteStack) Map(k string, v map[string]interface{}) *WriteStack {
   756  	l.base.Map(k, v)
   757  	return l
   758  }
   759  
   760  func (l *WriteStack) StringMap(k string, v map[string]string) *WriteStack {
   761  	l.base.StringMap(k, v)
   762  	return l
   763  }
   764  
   765  func (l *WriteStack) List(k string, list EncodableList) *WriteStack {
   766  	l.base.List(k, list)
   767  	return l
   768  }
   769  
   770  func (l *WriteStack) Object(k string, object EncodableObject) *WriteStack {
   771  	l.base.Object(k, object)
   772  	return l
   773  }
   774  
   775  func (l *WriteStack) ObjectFor(k string, fx func(ObjectEncoder)) *WriteStack {
   776  	l.base.ObjectFor(k, fx)
   777  	return l
   778  }
   779  
   780  func (l *WriteStack) ListFor(k string, fx func(ListEncoder)) *WriteStack {
   781  	l.base.ListFor(k, fx)
   782  	return l
   783  }