summaryrefslogtreecommitdiff
path: root/vendor/github.com/vmihailenco/msgpack/v5/decode.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/vmihailenco/msgpack/v5/decode.go')
-rw-r--r--vendor/github.com/vmihailenco/msgpack/v5/decode.go708
1 files changed, 0 insertions, 708 deletions
diff --git a/vendor/github.com/vmihailenco/msgpack/v5/decode.go b/vendor/github.com/vmihailenco/msgpack/v5/decode.go
deleted file mode 100644
index ea645aadb..000000000
--- a/vendor/github.com/vmihailenco/msgpack/v5/decode.go
+++ /dev/null
@@ -1,708 +0,0 @@
-package msgpack
-
-import (
- "bufio"
- "bytes"
- "errors"
- "fmt"
- "io"
- "reflect"
- "sync"
- "time"
-
- "github.com/vmihailenco/msgpack/v5/msgpcode"
-)
-
-const (
- bytesAllocLimit = 1 << 20 // 1mb
- sliceAllocLimit = 1e6 // 1m elements
- maxMapSize = 1e6 // 1m elements
-)
-
-const (
- looseInterfaceDecodingFlag uint32 = 1 << iota
- disallowUnknownFieldsFlag
- usePreallocateValues
- disableAllocLimitFlag
-)
-
-type bufReader interface {
- io.Reader
- io.ByteScanner
-}
-
-//------------------------------------------------------------------------------
-
-var decPool = sync.Pool{
- New: func() interface{} {
- return NewDecoder(nil)
- },
-}
-
-func GetDecoder() *Decoder {
- return decPool.Get().(*Decoder)
-}
-
-func PutDecoder(dec *Decoder) {
- dec.r = nil
- dec.s = nil
- decPool.Put(dec)
-}
-
-//------------------------------------------------------------------------------
-
-// Unmarshal decodes the MessagePack-encoded data and stores the result
-// in the value pointed to by v.
-func Unmarshal(data []byte, v interface{}) error {
- dec := GetDecoder()
- dec.UsePreallocateValues(true)
- dec.Reset(bytes.NewReader(data))
- err := dec.Decode(v)
-
- PutDecoder(dec)
-
- return err
-}
-
-// A Decoder reads and decodes MessagePack values from an input stream.
-type Decoder struct {
- r io.Reader
- s io.ByteScanner
- mapDecoder func(*Decoder) (interface{}, error)
- structTag string
- buf []byte
- rec []byte
- dict []string
- flags uint32
-}
-
-// NewDecoder returns a new decoder that reads from r.
-//
-// The decoder introduces its own buffering and may read data from r
-// beyond the requested msgpack values. Buffering can be disabled
-// by passing a reader that implements io.ByteScanner interface.
-func NewDecoder(r io.Reader) *Decoder {
- d := new(Decoder)
- d.Reset(r)
- return d
-}
-
-// Reset discards any buffered data, resets all state, and switches the buffered
-// reader to read from r.
-func (d *Decoder) Reset(r io.Reader) {
- d.ResetDict(r, nil)
-}
-
-// ResetDict is like Reset, but also resets the dict.
-func (d *Decoder) ResetDict(r io.Reader, dict []string) {
- d.ResetReader(r)
- d.flags = 0
- d.structTag = ""
- d.dict = dict
-}
-
-func (d *Decoder) WithDict(dict []string, fn func(*Decoder) error) error {
- oldDict := d.dict
- d.dict = dict
- err := fn(d)
- d.dict = oldDict
- return err
-}
-
-func (d *Decoder) ResetReader(r io.Reader) {
- d.mapDecoder = nil
- d.dict = nil
-
- if br, ok := r.(bufReader); ok {
- d.r = br
- d.s = br
- } else if r == nil {
- d.r = nil
- d.s = nil
- } else {
- br := bufio.NewReader(r)
- d.r = br
- d.s = br
- }
-}
-
-func (d *Decoder) SetMapDecoder(fn func(*Decoder) (interface{}, error)) {
- d.mapDecoder = fn
-}
-
-// UseLooseInterfaceDecoding causes decoder to use DecodeInterfaceLoose
-// to decode msgpack value into Go interface{}.
-func (d *Decoder) UseLooseInterfaceDecoding(on bool) {
- if on {
- d.flags |= looseInterfaceDecodingFlag
- } else {
- d.flags &= ^looseInterfaceDecodingFlag
- }
-}
-
-// SetCustomStructTag causes the decoder to use the supplied tag as a fallback option
-// if there is no msgpack tag.
-func (d *Decoder) SetCustomStructTag(tag string) {
- d.structTag = tag
-}
-
-// DisallowUnknownFields causes the Decoder to return an error when the destination
-// is a struct and the input contains object keys which do not match any
-// non-ignored, exported fields in the destination.
-func (d *Decoder) DisallowUnknownFields(on bool) {
- if on {
- d.flags |= disallowUnknownFieldsFlag
- } else {
- d.flags &= ^disallowUnknownFieldsFlag
- }
-}
-
-// UseInternedStrings enables support for decoding interned strings.
-func (d *Decoder) UseInternedStrings(on bool) {
- if on {
- d.flags |= useInternedStringsFlag
- } else {
- d.flags &= ^useInternedStringsFlag
- }
-}
-
-// UsePreallocateValues enables preallocating values in chunks
-func (d *Decoder) UsePreallocateValues(on bool) {
- if on {
- d.flags |= usePreallocateValues
- } else {
- d.flags &= ^usePreallocateValues
- }
-}
-
-// DisableAllocLimit enables fully allocating slices/maps when the size is known
-func (d *Decoder) DisableAllocLimit(on bool) {
- if on {
- d.flags |= disableAllocLimitFlag
- } else {
- d.flags &= ^disableAllocLimitFlag
- }
-}
-
-// Buffered returns a reader of the data remaining in the Decoder's buffer.
-// The reader is valid until the next call to Decode.
-func (d *Decoder) Buffered() io.Reader {
- return d.r
-}
-
-//nolint:gocyclo
-func (d *Decoder) Decode(v interface{}) error {
- var err error
- switch v := v.(type) {
- case *string:
- if v != nil {
- *v, err = d.DecodeString()
- return err
- }
- case *[]byte:
- if v != nil {
- return d.decodeBytesPtr(v)
- }
- case *int:
- if v != nil {
- *v, err = d.DecodeInt()
- return err
- }
- case *int8:
- if v != nil {
- *v, err = d.DecodeInt8()
- return err
- }
- case *int16:
- if v != nil {
- *v, err = d.DecodeInt16()
- return err
- }
- case *int32:
- if v != nil {
- *v, err = d.DecodeInt32()
- return err
- }
- case *int64:
- if v != nil {
- *v, err = d.DecodeInt64()
- return err
- }
- case *uint:
- if v != nil {
- *v, err = d.DecodeUint()
- return err
- }
- case *uint8:
- if v != nil {
- *v, err = d.DecodeUint8()
- return err
- }
- case *uint16:
- if v != nil {
- *v, err = d.DecodeUint16()
- return err
- }
- case *uint32:
- if v != nil {
- *v, err = d.DecodeUint32()
- return err
- }
- case *uint64:
- if v != nil {
- *v, err = d.DecodeUint64()
- return err
- }
- case *bool:
- if v != nil {
- *v, err = d.DecodeBool()
- return err
- }
- case *float32:
- if v != nil {
- *v, err = d.DecodeFloat32()
- return err
- }
- case *float64:
- if v != nil {
- *v, err = d.DecodeFloat64()
- return err
- }
- case *[]string:
- return d.decodeStringSlicePtr(v)
- case *map[string]string:
- return d.decodeMapStringStringPtr(v)
- case *map[string]interface{}:
- return d.decodeMapStringInterfacePtr(v)
- case *time.Duration:
- if v != nil {
- vv, err := d.DecodeInt64()
- *v = time.Duration(vv)
- return err
- }
- case *time.Time:
- if v != nil {
- *v, err = d.DecodeTime()
- return err
- }
- }
-
- vv := reflect.ValueOf(v)
- if !vv.IsValid() {
- return errors.New("msgpack: Decode(nil)")
- }
- if vv.Kind() != reflect.Ptr {
- return fmt.Errorf("msgpack: Decode(non-pointer %T)", v)
- }
- if vv.IsNil() {
- return fmt.Errorf("msgpack: Decode(non-settable %T)", v)
- }
-
- vv = vv.Elem()
- if vv.Kind() == reflect.Interface {
- if !vv.IsNil() {
- vv = vv.Elem()
- if vv.Kind() != reflect.Ptr {
- return fmt.Errorf("msgpack: Decode(non-pointer %s)", vv.Type().String())
- }
- }
- }
-
- return d.DecodeValue(vv)
-}
-
-func (d *Decoder) DecodeMulti(v ...interface{}) error {
- for _, vv := range v {
- if err := d.Decode(vv); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (d *Decoder) decodeInterfaceCond() (interface{}, error) {
- if d.flags&looseInterfaceDecodingFlag != 0 {
- return d.DecodeInterfaceLoose()
- }
- return d.DecodeInterface()
-}
-
-func (d *Decoder) DecodeValue(v reflect.Value) error {
- decode := getDecoder(v.Type())
- return decode(d, v)
-}
-
-func (d *Decoder) DecodeNil() error {
- c, err := d.readCode()
- if err != nil {
- return err
- }
- if c != msgpcode.Nil {
- return fmt.Errorf("msgpack: invalid code=%x decoding nil", c)
- }
- return nil
-}
-
-func (d *Decoder) decodeNilValue(v reflect.Value) error {
- err := d.DecodeNil()
- if v.IsNil() {
- return err
- }
- if v.Kind() == reflect.Ptr {
- v = v.Elem()
- }
- v.Set(reflect.Zero(v.Type()))
- return err
-}
-
-func (d *Decoder) DecodeBool() (bool, error) {
- c, err := d.readCode()
- if err != nil {
- return false, err
- }
- return d.bool(c)
-}
-
-func (d *Decoder) bool(c byte) (bool, error) {
- if c == msgpcode.Nil {
- return false, nil
- }
- if c == msgpcode.False {
- return false, nil
- }
- if c == msgpcode.True {
- return true, nil
- }
- return false, fmt.Errorf("msgpack: invalid code=%x decoding bool", c)
-}
-
-func (d *Decoder) DecodeDuration() (time.Duration, error) {
- n, err := d.DecodeInt64()
- if err != nil {
- return 0, err
- }
- return time.Duration(n), nil
-}
-
-// DecodeInterface decodes value into interface. It returns following types:
-// - nil,
-// - bool,
-// - int8, int16, int32, int64,
-// - uint8, uint16, uint32, uint64,
-// - float32 and float64,
-// - string,
-// - []byte,
-// - slices of any of the above,
-// - maps of any of the above.
-//
-// DecodeInterface should be used only when you don't know the type of value
-// you are decoding. For example, if you are decoding number it is better to use
-// DecodeInt64 for negative numbers and DecodeUint64 for positive numbers.
-func (d *Decoder) DecodeInterface() (interface{}, error) {
- c, err := d.readCode()
- if err != nil {
- return nil, err
- }
-
- if msgpcode.IsFixedNum(c) {
- return int8(c), nil
- }
- if msgpcode.IsFixedMap(c) {
- err = d.s.UnreadByte()
- if err != nil {
- return nil, err
- }
- return d.decodeMapDefault()
- }
- if msgpcode.IsFixedArray(c) {
- return d.decodeSlice(c)
- }
- if msgpcode.IsFixedString(c) {
- return d.string(c)
- }
-
- switch c {
- case msgpcode.Nil:
- return nil, nil
- case msgpcode.False, msgpcode.True:
- return d.bool(c)
- case msgpcode.Float:
- return d.float32(c)
- case msgpcode.Double:
- return d.float64(c)
- case msgpcode.Uint8:
- return d.uint8()
- case msgpcode.Uint16:
- return d.uint16()
- case msgpcode.Uint32:
- return d.uint32()
- case msgpcode.Uint64:
- return d.uint64()
- case msgpcode.Int8:
- return d.int8()
- case msgpcode.Int16:
- return d.int16()
- case msgpcode.Int32:
- return d.int32()
- case msgpcode.Int64:
- return d.int64()
- case msgpcode.Bin8, msgpcode.Bin16, msgpcode.Bin32:
- return d.bytes(c, nil)
- case msgpcode.Str8, msgpcode.Str16, msgpcode.Str32:
- return d.string(c)
- case msgpcode.Array16, msgpcode.Array32:
- return d.decodeSlice(c)
- case msgpcode.Map16, msgpcode.Map32:
- err = d.s.UnreadByte()
- if err != nil {
- return nil, err
- }
- return d.decodeMapDefault()
- case msgpcode.FixExt1, msgpcode.FixExt2, msgpcode.FixExt4, msgpcode.FixExt8, msgpcode.FixExt16,
- msgpcode.Ext8, msgpcode.Ext16, msgpcode.Ext32:
- return d.decodeInterfaceExt(c)
- }
-
- return 0, fmt.Errorf("msgpack: unknown code %x decoding interface{}", c)
-}
-
-// DecodeInterfaceLoose is like DecodeInterface except that:
-// - int8, int16, and int32 are converted to int64,
-// - uint8, uint16, and uint32 are converted to uint64,
-// - float32 is converted to float64.
-// - []byte is converted to string.
-func (d *Decoder) DecodeInterfaceLoose() (interface{}, error) {
- c, err := d.readCode()
- if err != nil {
- return nil, err
- }
-
- if msgpcode.IsFixedNum(c) {
- return int64(int8(c)), nil
- }
- if msgpcode.IsFixedMap(c) {
- err = d.s.UnreadByte()
- if err != nil {
- return nil, err
- }
- return d.decodeMapDefault()
- }
- if msgpcode.IsFixedArray(c) {
- return d.decodeSlice(c)
- }
- if msgpcode.IsFixedString(c) {
- return d.string(c)
- }
-
- switch c {
- case msgpcode.Nil:
- return nil, nil
- case msgpcode.False, msgpcode.True:
- return d.bool(c)
- case msgpcode.Float, msgpcode.Double:
- return d.float64(c)
- case msgpcode.Uint8, msgpcode.Uint16, msgpcode.Uint32, msgpcode.Uint64:
- return d.uint(c)
- case msgpcode.Int8, msgpcode.Int16, msgpcode.Int32, msgpcode.Int64:
- return d.int(c)
- case msgpcode.Str8, msgpcode.Str16, msgpcode.Str32,
- msgpcode.Bin8, msgpcode.Bin16, msgpcode.Bin32:
- return d.string(c)
- case msgpcode.Array16, msgpcode.Array32:
- return d.decodeSlice(c)
- case msgpcode.Map16, msgpcode.Map32:
- err = d.s.UnreadByte()
- if err != nil {
- return nil, err
- }
- return d.decodeMapDefault()
- case msgpcode.FixExt1, msgpcode.FixExt2, msgpcode.FixExt4, msgpcode.FixExt8, msgpcode.FixExt16,
- msgpcode.Ext8, msgpcode.Ext16, msgpcode.Ext32:
- return d.decodeInterfaceExt(c)
- }
-
- return 0, fmt.Errorf("msgpack: unknown code %x decoding interface{}", c)
-}
-
-// Skip skips next value.
-func (d *Decoder) Skip() error {
- c, err := d.readCode()
- if err != nil {
- return err
- }
-
- if msgpcode.IsFixedNum(c) {
- return nil
- }
- if msgpcode.IsFixedMap(c) {
- return d.skipMap(c)
- }
- if msgpcode.IsFixedArray(c) {
- return d.skipSlice(c)
- }
- if msgpcode.IsFixedString(c) {
- return d.skipBytes(c)
- }
-
- switch c {
- case msgpcode.Nil, msgpcode.False, msgpcode.True:
- return nil
- case msgpcode.Uint8, msgpcode.Int8:
- return d.skipN(1)
- case msgpcode.Uint16, msgpcode.Int16:
- return d.skipN(2)
- case msgpcode.Uint32, msgpcode.Int32, msgpcode.Float:
- return d.skipN(4)
- case msgpcode.Uint64, msgpcode.Int64, msgpcode.Double:
- return d.skipN(8)
- case msgpcode.Bin8, msgpcode.Bin16, msgpcode.Bin32:
- return d.skipBytes(c)
- case msgpcode.Str8, msgpcode.Str16, msgpcode.Str32:
- return d.skipBytes(c)
- case msgpcode.Array16, msgpcode.Array32:
- return d.skipSlice(c)
- case msgpcode.Map16, msgpcode.Map32:
- return d.skipMap(c)
- case msgpcode.FixExt1, msgpcode.FixExt2, msgpcode.FixExt4, msgpcode.FixExt8, msgpcode.FixExt16,
- msgpcode.Ext8, msgpcode.Ext16, msgpcode.Ext32:
- return d.skipExt(c)
- }
-
- return fmt.Errorf("msgpack: unknown code %x", c)
-}
-
-func (d *Decoder) DecodeRaw() (RawMessage, error) {
- d.rec = make([]byte, 0)
- if err := d.Skip(); err != nil {
- return nil, err
- }
- msg := RawMessage(d.rec)
- d.rec = nil
- return msg, nil
-}
-
-// PeekCode returns the next MessagePack code without advancing the reader.
-// Subpackage msgpack/codes defines the list of available msgpcode.
-func (d *Decoder) PeekCode() (byte, error) {
- c, err := d.s.ReadByte()
- if err != nil {
- return 0, err
- }
- return c, d.s.UnreadByte()
-}
-
-// ReadFull reads exactly len(buf) bytes into the buf.
-func (d *Decoder) ReadFull(buf []byte) error {
- _, err := readN(d.r, buf, len(buf))
- return err
-}
-
-func (d *Decoder) hasNilCode() bool {
- code, err := d.PeekCode()
- return err == nil && code == msgpcode.Nil
-}
-
-func (d *Decoder) readCode() (byte, error) {
- c, err := d.s.ReadByte()
- if err != nil {
- return 0, err
- }
- if d.rec != nil {
- d.rec = append(d.rec, c)
- }
- return c, nil
-}
-
-func (d *Decoder) readFull(b []byte) error {
- _, err := io.ReadFull(d.r, b)
- if err != nil {
- return err
- }
- if d.rec != nil {
- d.rec = append(d.rec, b...)
- }
- return nil
-}
-
-func (d *Decoder) readN(n int) ([]byte, error) {
- var err error
- if d.flags&disableAllocLimitFlag != 0 {
- d.buf, err = readN(d.r, d.buf, n)
- } else {
- d.buf, err = readNGrow(d.r, d.buf, n)
- }
- if err != nil {
- return nil, err
- }
- if d.rec != nil {
- // TODO: read directly into d.rec?
- d.rec = append(d.rec, d.buf...)
- }
- return d.buf, nil
-}
-
-func readN(r io.Reader, b []byte, n int) ([]byte, error) {
- if b == nil {
- if n == 0 {
- return make([]byte, 0), nil
- }
- b = make([]byte, 0, n)
- }
-
- if n > cap(b) {
- b = append(b, make([]byte, n-len(b))...)
- } else if n <= cap(b) {
- b = b[:n]
- }
-
- _, err := io.ReadFull(r, b)
- return b, err
-}
-
-func readNGrow(r io.Reader, b []byte, n int) ([]byte, error) {
- if b == nil {
- if n == 0 {
- return make([]byte, 0), nil
- }
- switch {
- case n < 64:
- b = make([]byte, 0, 64)
- case n <= bytesAllocLimit:
- b = make([]byte, 0, n)
- default:
- b = make([]byte, 0, bytesAllocLimit)
- }
- }
-
- if n <= cap(b) {
- b = b[:n]
- _, err := io.ReadFull(r, b)
- return b, err
- }
- b = b[:cap(b)]
-
- var pos int
- for {
- alloc := min(n-len(b), bytesAllocLimit)
- b = append(b, make([]byte, alloc)...)
-
- _, err := io.ReadFull(r, b[pos:])
- if err != nil {
- return b, err
- }
-
- if len(b) == n {
- break
- }
- pos = len(b)
- }
-
- return b, nil
-}
-
-func min(a, b int) int { //nolint:unparam
- if a <= b {
- return a
- }
- return b
-}