decode_value.go 5.9 KB

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