decode_value.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package msgpack
  2. import (
  3. "errors"
  4. "fmt"
  5. "reflect"
  6. )
  7. var interfaceType = reflect.TypeOf((*interface{})(nil)).Elem()
  8. var stringType = reflect.TypeOf((*string)(nil)).Elem()
  9. var valueDecoders []decoderFunc
  10. func init() {
  11. valueDecoders = []decoderFunc{
  12. reflect.Bool: decodeBoolValue,
  13. reflect.Int: decodeInt64Value,
  14. reflect.Int8: decodeInt64Value,
  15. reflect.Int16: decodeInt64Value,
  16. reflect.Int32: decodeInt64Value,
  17. reflect.Int64: decodeInt64Value,
  18. reflect.Uint: decodeUint64Value,
  19. reflect.Uint8: decodeUint64Value,
  20. reflect.Uint16: decodeUint64Value,
  21. reflect.Uint32: decodeUint64Value,
  22. reflect.Uint64: decodeUint64Value,
  23. reflect.Float32: decodeFloat32Value,
  24. reflect.Float64: decodeFloat64Value,
  25. reflect.Complex64: decodeUnsupportedValue,
  26. reflect.Complex128: decodeUnsupportedValue,
  27. reflect.Array: decodeArrayValue,
  28. reflect.Chan: decodeUnsupportedValue,
  29. reflect.Func: decodeUnsupportedValue,
  30. reflect.Interface: decodeInterfaceValue,
  31. reflect.Map: decodeMapValue,
  32. reflect.Ptr: decodeUnsupportedValue,
  33. reflect.Slice: decodeSliceValue,
  34. reflect.String: decodeStringValue,
  35. reflect.Struct: decodeStructValue,
  36. reflect.UnsafePointer: decodeUnsupportedValue,
  37. }
  38. }
  39. func mustSet(v reflect.Value) error {
  40. if !v.CanSet() {
  41. return fmt.Errorf("msgpack: Decode(nonsettable %s)", v.Type())
  42. }
  43. return nil
  44. }
  45. func getDecoder(typ reflect.Type) decoderFunc {
  46. kind := typ.Kind()
  47. decoder, ok := typDecMap[typ]
  48. if ok {
  49. return decoder
  50. }
  51. if typ.Implements(customDecoderType) {
  52. return decodeCustomValue
  53. }
  54. if typ.Implements(unmarshalerType) {
  55. return unmarshalValue
  56. }
  57. // Addressable struct field value.
  58. if kind != reflect.Ptr {
  59. ptr := reflect.PtrTo(typ)
  60. if ptr.Implements(customDecoderType) {
  61. return decodeCustomValueAddr
  62. }
  63. if ptr.Implements(unmarshalerType) {
  64. return unmarshalValueAddr
  65. }
  66. }
  67. switch kind {
  68. case reflect.Ptr:
  69. return ptrDecoderFunc(typ)
  70. case reflect.Slice:
  71. elem := typ.Elem()
  72. switch elem.Kind() {
  73. case reflect.Uint8:
  74. return decodeBytesValue
  75. }
  76. switch elem {
  77. case stringType:
  78. return decodeStringSliceValue
  79. }
  80. case reflect.Array:
  81. if typ.Elem().Kind() == reflect.Uint8 {
  82. return decodeByteArrayValue
  83. }
  84. case reflect.Map:
  85. if typ.Key() == stringType {
  86. switch typ.Elem() {
  87. case stringType:
  88. return decodeMapStringStringValue
  89. case interfaceType:
  90. return decodeMapStringInterfaceValue
  91. }
  92. }
  93. }
  94. return valueDecoders[kind]
  95. }
  96. func ptrDecoderFunc(typ reflect.Type) decoderFunc {
  97. decoder := getDecoder(typ.Elem())
  98. return func(d *Decoder, v reflect.Value) error {
  99. if d.hasNilCode() {
  100. if err := mustSet(v); err != nil {
  101. return err
  102. }
  103. if !v.IsNil() {
  104. v.Set(reflect.Zero(v.Type()))
  105. }
  106. return d.DecodeNil()
  107. }
  108. if v.IsNil() {
  109. if err := mustSet(v); err != nil {
  110. return err
  111. }
  112. v.Set(reflect.New(v.Type().Elem()))
  113. }
  114. return decoder(d, v.Elem())
  115. }
  116. }
  117. func decodeCustomValueAddr(d *Decoder, v reflect.Value) error {
  118. if !v.CanAddr() {
  119. return fmt.Errorf("msgpack: Decode(nonaddressable %T)", v.Interface())
  120. }
  121. return decodeCustomValue(d, v.Addr())
  122. }
  123. func decodeCustomValue(d *Decoder, v reflect.Value) error {
  124. if d.hasNilCode() {
  125. return d.decodeNilValue(v)
  126. }
  127. if v.IsNil() {
  128. v.Set(reflect.New(v.Type().Elem()))
  129. }
  130. decoder := v.Interface().(CustomDecoder)
  131. return decoder.DecodeMsgpack(d)
  132. }
  133. func unmarshalValueAddr(d *Decoder, v reflect.Value) error {
  134. if !v.CanAddr() {
  135. return fmt.Errorf("msgpack: Decode(nonaddressable %T)", v.Interface())
  136. }
  137. return unmarshalValue(d, v.Addr())
  138. }
  139. func unmarshalValue(d *Decoder, v reflect.Value) error {
  140. if d.extLen == 0 || d.extLen == 1 {
  141. if d.hasNilCode() {
  142. return d.decodeNilValue(v)
  143. }
  144. }
  145. if v.IsNil() {
  146. v.Set(reflect.New(v.Type().Elem()))
  147. }
  148. if d.extLen != 0 {
  149. b, err := d.readN(d.extLen)
  150. if err != nil {
  151. return err
  152. }
  153. d.rec = b
  154. } else {
  155. d.rec = makeBuffer()
  156. if err := d.Skip(); err != nil {
  157. return err
  158. }
  159. }
  160. unmarshaler := v.Interface().(Unmarshaler)
  161. err := unmarshaler.UnmarshalMsgpack(d.rec)
  162. d.rec = nil
  163. return err
  164. }
  165. func decodeBoolValue(d *Decoder, v reflect.Value) error {
  166. flag, err := d.DecodeBool()
  167. if err != nil {
  168. return err
  169. }
  170. if err = mustSet(v); err != nil {
  171. return err
  172. }
  173. v.SetBool(flag)
  174. return nil
  175. }
  176. func decodeInterfaceValue(d *Decoder, v reflect.Value) error {
  177. if v.IsNil() {
  178. return d.interfaceValue(v)
  179. }
  180. elem := v.Elem()
  181. if !elem.CanAddr() {
  182. if d.hasNilCode() {
  183. v.Set(reflect.Zero(v.Type()))
  184. return d.DecodeNil()
  185. }
  186. }
  187. return d.DecodeValue(elem)
  188. }
  189. func (d *Decoder) interfaceValue(v reflect.Value) error {
  190. vv, err := d.decodeInterfaceCond()
  191. if err != nil {
  192. return err
  193. }
  194. if vv != nil {
  195. if v.Type() == errorType {
  196. if vv, ok := vv.(string); ok {
  197. v.Set(reflect.ValueOf(errors.New(vv)))
  198. return nil
  199. }
  200. }
  201. v.Set(reflect.ValueOf(vv))
  202. }
  203. return nil
  204. }
  205. func decodeUnsupportedValue(d *Decoder, v reflect.Value) error {
  206. return fmt.Errorf("msgpack: Decode(unsupported %s)", v.Type())
  207. }