9 var interfaceType = reflect.TypeOf((*interface{})(nil)).Elem()
10 var stringType = reflect.TypeOf((*string)(nil)).Elem()
12 var valueDecoders []decoderFunc
15 valueDecoders = []decoderFunc{
16 reflect.Bool: decodeBoolValue,
17 reflect.Int: decodeInt64Value,
18 reflect.Int8: decodeInt64Value,
19 reflect.Int16: decodeInt64Value,
20 reflect.Int32: decodeInt64Value,
21 reflect.Int64: decodeInt64Value,
22 reflect.Uint: decodeUint64Value,
23 reflect.Uint8: decodeUint64Value,
24 reflect.Uint16: decodeUint64Value,
25 reflect.Uint32: decodeUint64Value,
26 reflect.Uint64: decodeUint64Value,
27 reflect.Float32: decodeFloat32Value,
28 reflect.Float64: decodeFloat64Value,
29 reflect.Complex64: decodeUnsupportedValue,
30 reflect.Complex128: decodeUnsupportedValue,
31 reflect.Array: decodeArrayValue,
32 reflect.Chan: decodeUnsupportedValue,
33 reflect.Func: decodeUnsupportedValue,
34 reflect.Interface: decodeInterfaceValue,
35 reflect.Map: decodeMapValue,
36 reflect.Ptr: decodeUnsupportedValue,
37 reflect.Slice: decodeSliceValue,
38 reflect.String: decodeStringValue,
39 reflect.Struct: decodeStructValue,
40 reflect.UnsafePointer: decodeUnsupportedValue,
44 func mustSet(v reflect.Value) error {
46 return fmt.Errorf("msgpack: Decode(nonsettable %s)", v.Type())
51 func getDecoder(typ reflect.Type) decoderFunc {
54 decoder, ok := typDecMap[typ]
59 if typ.Implements(customDecoderType) {
60 return decodeCustomValue
62 if typ.Implements(unmarshalerType) {
66 // Addressable struct field value.
67 if kind != reflect.Ptr {
68 ptr := reflect.PtrTo(typ)
69 if ptr.Implements(customDecoderType) {
70 return decodeCustomValueAddr
72 if ptr.Implements(unmarshalerType) {
73 return unmarshalValueAddr
79 return ptrDecoderFunc(typ)
84 return decodeBytesValue
88 return decodeStringSliceValue
91 if typ.Elem().Kind() == reflect.Uint8 {
92 return decodeByteArrayValue
95 if typ.Key() == stringType {
98 return decodeMapStringStringValue
100 return decodeMapStringInterfaceValue
104 return valueDecoders[kind]
107 func ptrDecoderFunc(typ reflect.Type) decoderFunc {
108 decoder := getDecoder(typ.Elem())
109 return func(d *Decoder, v reflect.Value) error {
111 if err := mustSet(v); err != nil {
115 v.Set(reflect.Zero(v.Type()))
120 if err := mustSet(v); err != nil {
123 v.Set(reflect.New(v.Type().Elem()))
125 return decoder(d, v.Elem())
129 func decodeCustomValueAddr(d *Decoder, v reflect.Value) error {
131 return fmt.Errorf("msgpack: Decode(nonaddressable %T)", v.Interface())
133 return decodeCustomValue(d, v.Addr())
136 func decodeCustomValue(d *Decoder, v reflect.Value) error {
138 return d.decodeNilValue(v)
142 v.Set(reflect.New(v.Type().Elem()))
145 decoder := v.Interface().(CustomDecoder)
146 return decoder.DecodeMsgpack(d)
149 func unmarshalValueAddr(d *Decoder, v reflect.Value) error {
151 return fmt.Errorf("msgpack: Decode(nonaddressable %T)", v.Interface())
153 return unmarshalValue(d, v.Addr())
156 func unmarshalValue(d *Decoder, v reflect.Value) error {
158 return d.decodeNilValue(v)
162 v.Set(reflect.New(v.Type().Elem()))
166 b, err := d.readN(d.extLen)
173 if err := d.Skip(); err != nil {
178 unmarshaler := v.Interface().(Unmarshaler)
179 err := unmarshaler.UnmarshalMsgpack(d.rec)
184 func decodeBoolValue(d *Decoder, v reflect.Value) error {
185 flag, err := d.DecodeBool()
189 if err = mustSet(v); err != nil {
196 func decodeInterfaceValue(d *Decoder, v reflect.Value) error {
198 return d.interfaceValue(v)
204 v.Set(reflect.Zero(v.Type()))
209 return d.DecodeValue(elem)
212 func (d *Decoder) interfaceValue(v reflect.Value) error {
213 vv, err := d.decodeInterfaceCond()
219 if v.Type() == errorType {
220 if vv, ok := vv.(string); ok {
221 v.Set(reflect.ValueOf(errors.New(vv)))
226 v.Set(reflect.ValueOf(vv))
232 func decodeUnsupportedValue(d *Decoder, v reflect.Value) error {
233 return fmt.Errorf("msgpack: Decode(unsupported %s)", v.Type())