8 "github.com/vmihailenco/msgpack/codes"
11 const mapElemsAllocLimit = 1e4
13 var mapStringStringPtrType = reflect.TypeOf((*map[string]string)(nil))
14 var mapStringStringType = mapStringStringPtrType.Elem()
16 var mapStringInterfacePtrType = reflect.TypeOf((*map[string]interface{})(nil))
17 var mapStringInterfaceType = mapStringInterfacePtrType.Elem()
19 var errInvalidCode = errors.New("invalid code")
21 func decodeMapValue(d *Decoder, v reflect.Value) error {
22 size, err := d.DecodeMapLen()
29 v.Set(reflect.Zero(typ))
34 v.Set(reflect.MakeMap(typ))
40 return decodeMapValueSize(d, v, size)
43 func decodeMapValueSize(d *Decoder, v reflect.Value, size int) error {
46 valueType := typ.Elem()
48 for i := 0; i < size; i++ {
49 mk := reflect.New(keyType).Elem()
50 if err := d.DecodeValue(mk); err != nil {
54 mv := reflect.New(valueType).Elem()
55 if err := d.DecodeValue(mv); err != nil {
65 // DecodeMapLen decodes map length. Length is -1 when map is nil.
66 func (d *Decoder) DecodeMapLen() (int, error) {
67 c, err := d.readCode()
73 if err = d.skipExtHeader(c); err != nil {
85 func (d *Decoder) mapLen(c codes.Code) (int, error) {
86 size, err := d._mapLen(c)
87 err = expandInvalidCodeMapLenError(c, err)
91 func (d *Decoder) _mapLen(c codes.Code) (int, error) {
95 if c >= codes.FixedMapLow && c <= codes.FixedMapHigh {
96 return int(c & codes.FixedMapMask), nil
99 size, err := d.uint16()
100 return int(size), err
102 if c == codes.Map32 {
103 size, err := d.uint32()
104 return int(size), err
106 return 0, errInvalidCode
109 func expandInvalidCodeMapLenError(c codes.Code, err error) error {
110 if err == errInvalidCode {
111 return fmt.Errorf("msgpack: invalid code=%x decoding map length", c)
116 func decodeMapStringStringValue(d *Decoder, v reflect.Value) error {
117 mptr := v.Addr().Convert(mapStringStringPtrType).Interface().(*map[string]string)
118 return d.decodeMapStringStringPtr(mptr)
121 func (d *Decoder) decodeMapStringStringPtr(ptr *map[string]string) error {
122 size, err := d.DecodeMapLen()
133 *ptr = make(map[string]string, min(size, mapElemsAllocLimit))
137 for i := 0; i < size; i++ {
138 mk, err := d.DecodeString()
142 mv, err := d.DecodeString()
152 func decodeMapStringInterfaceValue(d *Decoder, v reflect.Value) error {
153 ptr := v.Addr().Convert(mapStringInterfacePtrType).Interface().(*map[string]interface{})
154 return d.decodeMapStringInterfacePtr(ptr)
157 func (d *Decoder) decodeMapStringInterfacePtr(ptr *map[string]interface{}) error {
158 n, err := d.DecodeMapLen()
169 *ptr = make(map[string]interface{}, min(n, mapElemsAllocLimit))
173 for i := 0; i < n; i++ {
174 mk, err := d.DecodeString()
178 mv, err := d.decodeInterfaceCond()
188 func (d *Decoder) DecodeMap() (interface{}, error) {
189 if d.decodeMapFunc != nil {
190 return d.decodeMapFunc(d)
193 size, err := d.DecodeMapLen()
201 return make(map[string]interface{}), nil
204 code, err := d.PeekCode()
209 if codes.IsString(code) {
210 return d.decodeMapStringInterfaceSize(size)
213 key, err := d.decodeInterfaceCond()
218 value, err := d.decodeInterfaceCond()
223 keyType := reflect.TypeOf(key)
224 valueType := reflect.TypeOf(value)
225 mapType := reflect.MapOf(keyType, valueType)
226 mapValue := reflect.MakeMap(mapType)
228 mapValue.SetMapIndex(reflect.ValueOf(key), reflect.ValueOf(value))
231 err = decodeMapValueSize(d, mapValue, size)
236 return mapValue.Interface(), nil
239 func (d *Decoder) decodeMapStringInterfaceSize(size int) (map[string]interface{}, error) {
240 m := make(map[string]interface{}, min(size, mapElemsAllocLimit))
241 for i := 0; i < size; i++ {
242 mk, err := d.DecodeString()
246 mv, err := d.decodeInterfaceCond()
255 func (d *Decoder) skipMap(c codes.Code) error {
256 n, err := d.mapLen(c)
260 for i := 0; i < n; i++ {
261 if err := d.Skip(); err != nil {
264 if err := d.Skip(); err != nil {
271 func decodeStructValue(d *Decoder, v reflect.Value) error {
272 c, err := d.readCode()
279 n, err := d._mapLen(c)
282 n, err2 = d.arrayLen(c)
284 return expandInvalidCodeMapLenError(c, err)
289 if err = mustSet(v); err != nil {
292 v.Set(reflect.Zero(v.Type()))
298 fields = jsonStructs.Fields(v.Type())
300 fields = structs.Fields(v.Type())
304 for i, f := range fields.List {
308 if err := f.DecodeValue(d, v); err != nil {
312 // Skip extra values.
313 for i := len(fields.List); i < n; i++ {
314 if err := d.Skip(); err != nil {
321 for i := 0; i < n; i++ {
322 name, err := d.DecodeString()
326 if f := fields.Table[name]; f != nil {
327 if err := f.DecodeValue(d, v); err != nil {
331 if err := d.Skip(); err != nil {