assign.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. package decoder
  2. import (
  3. "fmt"
  4. "reflect"
  5. "strconv"
  6. )
  7. var (
  8. nilValue = reflect.ValueOf(nil)
  9. )
  10. func AssignValue(src, dst reflect.Value) error {
  11. if dst.Type().Kind() != reflect.Ptr {
  12. return fmt.Errorf("invalid dst type. required pointer type: %T", dst.Type())
  13. }
  14. casted, err := castValue(dst.Elem().Type(), src)
  15. if err != nil {
  16. return err
  17. }
  18. dst.Elem().Set(casted)
  19. return nil
  20. }
  21. func castValue(t reflect.Type, v reflect.Value) (reflect.Value, error) {
  22. switch t.Kind() {
  23. case reflect.Int:
  24. vv, err := castInt(v)
  25. if err != nil {
  26. return nilValue, err
  27. }
  28. return reflect.ValueOf(int(vv.Int())), nil
  29. case reflect.Int8:
  30. vv, err := castInt(v)
  31. if err != nil {
  32. return nilValue, err
  33. }
  34. return reflect.ValueOf(int8(vv.Int())), nil
  35. case reflect.Int16:
  36. vv, err := castInt(v)
  37. if err != nil {
  38. return nilValue, err
  39. }
  40. return reflect.ValueOf(int16(vv.Int())), nil
  41. case reflect.Int32:
  42. vv, err := castInt(v)
  43. if err != nil {
  44. return nilValue, err
  45. }
  46. return reflect.ValueOf(int32(vv.Int())), nil
  47. case reflect.Int64:
  48. return castInt(v)
  49. case reflect.Uint:
  50. vv, err := castUint(v)
  51. if err != nil {
  52. return nilValue, err
  53. }
  54. return reflect.ValueOf(uint(vv.Uint())), nil
  55. case reflect.Uint8:
  56. vv, err := castUint(v)
  57. if err != nil {
  58. return nilValue, err
  59. }
  60. return reflect.ValueOf(uint8(vv.Uint())), nil
  61. case reflect.Uint16:
  62. vv, err := castUint(v)
  63. if err != nil {
  64. return nilValue, err
  65. }
  66. return reflect.ValueOf(uint16(vv.Uint())), nil
  67. case reflect.Uint32:
  68. vv, err := castUint(v)
  69. if err != nil {
  70. return nilValue, err
  71. }
  72. return reflect.ValueOf(uint32(vv.Uint())), nil
  73. case reflect.Uint64:
  74. return castUint(v)
  75. case reflect.Uintptr:
  76. vv, err := castUint(v)
  77. if err != nil {
  78. return nilValue, err
  79. }
  80. return reflect.ValueOf(uintptr(vv.Uint())), nil
  81. case reflect.String:
  82. return castString(v)
  83. case reflect.Bool:
  84. return castBool(v)
  85. case reflect.Float32:
  86. vv, err := castFloat(v)
  87. if err != nil {
  88. return nilValue, err
  89. }
  90. return reflect.ValueOf(float32(vv.Float())), nil
  91. case reflect.Float64:
  92. return castFloat(v)
  93. case reflect.Array:
  94. return castArray(t, v)
  95. case reflect.Slice:
  96. return castSlice(t, v)
  97. case reflect.Map:
  98. return castMap(t, v)
  99. case reflect.Struct:
  100. return castStruct(t, v)
  101. }
  102. return v, nil
  103. }
  104. func castInt(v reflect.Value) (reflect.Value, error) {
  105. switch v.Type().Kind() {
  106. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  107. return v, nil
  108. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  109. return reflect.ValueOf(int64(v.Uint())), nil
  110. case reflect.String:
  111. i64, err := strconv.ParseInt(v.String(), 10, 64)
  112. if err != nil {
  113. return nilValue, err
  114. }
  115. return reflect.ValueOf(i64), nil
  116. case reflect.Bool:
  117. if v.Bool() {
  118. return reflect.ValueOf(int64(1)), nil
  119. }
  120. return reflect.ValueOf(int64(0)), nil
  121. case reflect.Float32, reflect.Float64:
  122. return reflect.ValueOf(int64(v.Float())), nil
  123. case reflect.Array:
  124. if v.Len() > 0 {
  125. return castInt(v.Index(0))
  126. }
  127. return nilValue, fmt.Errorf("failed to cast to int64 from empty array")
  128. case reflect.Slice:
  129. if v.Len() > 0 {
  130. return castInt(v.Index(0))
  131. }
  132. return nilValue, fmt.Errorf("failed to cast to int64 from empty slice")
  133. case reflect.Interface:
  134. return castInt(reflect.ValueOf(v.Interface()))
  135. case reflect.Map:
  136. return nilValue, fmt.Errorf("failed to cast to int64 from map")
  137. case reflect.Struct:
  138. return nilValue, fmt.Errorf("failed to cast to int64 from struct")
  139. case reflect.Ptr:
  140. return castInt(v.Elem())
  141. }
  142. return nilValue, fmt.Errorf("failed to cast to int64 from %s", v.Type().Kind())
  143. }
  144. func castUint(v reflect.Value) (reflect.Value, error) {
  145. switch v.Type().Kind() {
  146. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  147. return reflect.ValueOf(uint64(v.Int())), nil
  148. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  149. return v, nil
  150. case reflect.String:
  151. u64, err := strconv.ParseUint(v.String(), 10, 64)
  152. if err != nil {
  153. return nilValue, err
  154. }
  155. return reflect.ValueOf(u64), nil
  156. case reflect.Bool:
  157. if v.Bool() {
  158. return reflect.ValueOf(uint64(1)), nil
  159. }
  160. return reflect.ValueOf(uint64(0)), nil
  161. case reflect.Float32, reflect.Float64:
  162. return reflect.ValueOf(uint64(v.Float())), nil
  163. case reflect.Array:
  164. if v.Len() > 0 {
  165. return castUint(v.Index(0))
  166. }
  167. return nilValue, fmt.Errorf("failed to cast to uint64 from empty array")
  168. case reflect.Slice:
  169. if v.Len() > 0 {
  170. return castUint(v.Index(0))
  171. }
  172. return nilValue, fmt.Errorf("failed to cast to uint64 from empty slice")
  173. case reflect.Interface:
  174. return castUint(reflect.ValueOf(v.Interface()))
  175. case reflect.Map:
  176. return nilValue, fmt.Errorf("failed to cast to uint64 from map")
  177. case reflect.Struct:
  178. return nilValue, fmt.Errorf("failed to cast to uint64 from struct")
  179. case reflect.Ptr:
  180. return castUint(v.Elem())
  181. }
  182. return nilValue, fmt.Errorf("failed to cast to uint64 from %s", v.Type().Kind())
  183. }
  184. func castString(v reflect.Value) (reflect.Value, error) {
  185. switch v.Type().Kind() {
  186. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  187. return reflect.ValueOf(fmt.Sprint(v.Int())), nil
  188. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  189. return reflect.ValueOf(fmt.Sprint(v.Uint())), nil
  190. case reflect.String:
  191. return v, nil
  192. case reflect.Bool:
  193. if v.Bool() {
  194. return reflect.ValueOf("true"), nil
  195. }
  196. return reflect.ValueOf("false"), nil
  197. case reflect.Float32, reflect.Float64:
  198. return reflect.ValueOf(fmt.Sprint(v.Float())), nil
  199. case reflect.Array:
  200. if v.Len() > 0 {
  201. return castString(v.Index(0))
  202. }
  203. return nilValue, fmt.Errorf("failed to cast to string from empty array")
  204. case reflect.Slice:
  205. if v.Len() > 0 {
  206. return castString(v.Index(0))
  207. }
  208. return nilValue, fmt.Errorf("failed to cast to string from empty slice")
  209. case reflect.Interface:
  210. return castString(reflect.ValueOf(v.Interface()))
  211. case reflect.Map:
  212. return nilValue, fmt.Errorf("failed to cast to string from map")
  213. case reflect.Struct:
  214. return nilValue, fmt.Errorf("failed to cast to string from struct")
  215. case reflect.Ptr:
  216. return castString(v.Elem())
  217. }
  218. return nilValue, fmt.Errorf("failed to cast to string from %s", v.Type().Kind())
  219. }
  220. func castBool(v reflect.Value) (reflect.Value, error) {
  221. switch v.Type().Kind() {
  222. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  223. switch v.Int() {
  224. case 0:
  225. return reflect.ValueOf(false), nil
  226. case 1:
  227. return reflect.ValueOf(true), nil
  228. }
  229. return nilValue, fmt.Errorf("failed to cast to bool from %d", v.Int())
  230. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  231. switch v.Uint() {
  232. case 0:
  233. return reflect.ValueOf(false), nil
  234. case 1:
  235. return reflect.ValueOf(true), nil
  236. }
  237. return nilValue, fmt.Errorf("failed to cast to bool from %d", v.Uint())
  238. case reflect.String:
  239. b, err := strconv.ParseBool(v.String())
  240. if err != nil {
  241. return nilValue, err
  242. }
  243. return reflect.ValueOf(b), nil
  244. case reflect.Bool:
  245. return v, nil
  246. case reflect.Float32, reflect.Float64:
  247. switch v.Float() {
  248. case 0:
  249. return reflect.ValueOf(false), nil
  250. case 1:
  251. return reflect.ValueOf(true), nil
  252. }
  253. return nilValue, fmt.Errorf("failed to cast to bool from %f", v.Float())
  254. case reflect.Array:
  255. if v.Len() > 0 {
  256. return castBool(v.Index(0))
  257. }
  258. return nilValue, fmt.Errorf("failed to cast to string from empty array")
  259. case reflect.Slice:
  260. if v.Len() > 0 {
  261. return castBool(v.Index(0))
  262. }
  263. return nilValue, fmt.Errorf("failed to cast to string from empty slice")
  264. case reflect.Interface:
  265. return castBool(reflect.ValueOf(v.Interface()))
  266. case reflect.Map:
  267. return nilValue, fmt.Errorf("failed to cast to string from map")
  268. case reflect.Struct:
  269. return nilValue, fmt.Errorf("failed to cast to string from struct")
  270. case reflect.Ptr:
  271. return castBool(v.Elem())
  272. }
  273. return nilValue, fmt.Errorf("failed to cast to bool from %s", v.Type().Kind())
  274. }
  275. func castFloat(v reflect.Value) (reflect.Value, error) {
  276. switch v.Type().Kind() {
  277. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  278. return reflect.ValueOf(float64(v.Int())), nil
  279. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  280. return reflect.ValueOf(float64(v.Uint())), nil
  281. case reflect.String:
  282. f64, err := strconv.ParseFloat(v.String(), 64)
  283. if err != nil {
  284. return nilValue, err
  285. }
  286. return reflect.ValueOf(f64), nil
  287. case reflect.Bool:
  288. if v.Bool() {
  289. return reflect.ValueOf(float64(1)), nil
  290. }
  291. return reflect.ValueOf(float64(0)), nil
  292. case reflect.Float32, reflect.Float64:
  293. return v, nil
  294. case reflect.Array:
  295. if v.Len() > 0 {
  296. return castFloat(v.Index(0))
  297. }
  298. return nilValue, fmt.Errorf("failed to cast to float64 from empty array")
  299. case reflect.Slice:
  300. if v.Len() > 0 {
  301. return castFloat(v.Index(0))
  302. }
  303. return nilValue, fmt.Errorf("failed to cast to float64 from empty slice")
  304. case reflect.Interface:
  305. return castFloat(reflect.ValueOf(v.Interface()))
  306. case reflect.Map:
  307. return nilValue, fmt.Errorf("failed to cast to float64 from map")
  308. case reflect.Struct:
  309. return nilValue, fmt.Errorf("failed to cast to float64 from struct")
  310. case reflect.Ptr:
  311. return castFloat(v.Elem())
  312. }
  313. return nilValue, fmt.Errorf("failed to cast to float64 from %s", v.Type().Kind())
  314. }
  315. func castArray(t reflect.Type, v reflect.Value) (reflect.Value, error) {
  316. kind := v.Type().Kind()
  317. if kind == reflect.Interface {
  318. return castArray(t, reflect.ValueOf(v.Interface()))
  319. }
  320. if kind != reflect.Slice && kind != reflect.Array {
  321. return nilValue, fmt.Errorf("failed to cast to array from %s", kind)
  322. }
  323. if t.Elem() == v.Type().Elem() {
  324. return v, nil
  325. }
  326. if t.Len() != v.Len() {
  327. return nilValue, fmt.Errorf("failed to cast [%d]array from slice of %d length", t.Len(), v.Len())
  328. }
  329. ret := reflect.New(t).Elem()
  330. for i := 0; i < v.Len(); i++ {
  331. vv, err := castValue(t.Elem(), v.Index(i))
  332. if err != nil {
  333. return nilValue, err
  334. }
  335. ret.Index(i).Set(vv)
  336. }
  337. return ret, nil
  338. }
  339. func castSlice(t reflect.Type, v reflect.Value) (reflect.Value, error) {
  340. kind := v.Type().Kind()
  341. if kind == reflect.Interface {
  342. return castSlice(t, reflect.ValueOf(v.Interface()))
  343. }
  344. if kind != reflect.Slice && kind != reflect.Array {
  345. return nilValue, fmt.Errorf("failed to cast to slice from %s", kind)
  346. }
  347. if t.Elem() == v.Type().Elem() {
  348. return v, nil
  349. }
  350. ret := reflect.MakeSlice(t, v.Len(), v.Len())
  351. for i := 0; i < v.Len(); i++ {
  352. vv, err := castValue(t.Elem(), v.Index(i))
  353. if err != nil {
  354. return nilValue, err
  355. }
  356. ret.Index(i).Set(vv)
  357. }
  358. return ret, nil
  359. }
  360. func castMap(t reflect.Type, v reflect.Value) (reflect.Value, error) {
  361. ret := reflect.MakeMap(t)
  362. switch v.Type().Kind() {
  363. case reflect.Map:
  364. iter := v.MapRange()
  365. for iter.Next() {
  366. key, err := castValue(t.Key(), iter.Key())
  367. if err != nil {
  368. return nilValue, err
  369. }
  370. value, err := castValue(t.Elem(), iter.Value())
  371. if err != nil {
  372. return nilValue, err
  373. }
  374. ret.SetMapIndex(key, value)
  375. }
  376. return ret, nil
  377. case reflect.Interface:
  378. return castMap(t, reflect.ValueOf(v.Interface()))
  379. case reflect.Slice:
  380. if v.Len() > 0 {
  381. return castMap(t, v.Index(0))
  382. }
  383. return nilValue, fmt.Errorf("failed to cast to map from empty slice")
  384. }
  385. return nilValue, fmt.Errorf("failed to cast to map from %s", v.Type().Kind())
  386. }
  387. func castStruct(t reflect.Type, v reflect.Value) (reflect.Value, error) {
  388. ret := reflect.New(t).Elem()
  389. switch v.Type().Kind() {
  390. case reflect.Map:
  391. iter := v.MapRange()
  392. for iter.Next() {
  393. key := iter.Key()
  394. k, err := castString(key)
  395. if err != nil {
  396. return nilValue, err
  397. }
  398. fieldName := k.String()
  399. field, ok := t.FieldByName(fieldName)
  400. if ok {
  401. value, err := castValue(field.Type, iter.Value())
  402. if err != nil {
  403. return nilValue, err
  404. }
  405. ret.FieldByName(fieldName).Set(value)
  406. }
  407. }
  408. return ret, nil
  409. case reflect.Struct:
  410. for i := 0; i < v.Type().NumField(); i++ {
  411. name := v.Type().Field(i).Name
  412. ret.FieldByName(name).Set(v.FieldByName(name))
  413. }
  414. return ret, nil
  415. case reflect.Interface:
  416. return castStruct(t, reflect.ValueOf(v.Interface()))
  417. case reflect.Slice:
  418. if v.Len() > 0 {
  419. return castStruct(t, v.Index(0))
  420. }
  421. return nilValue, fmt.Errorf("failed to cast to struct from empty slice")
  422. default:
  423. return nilValue, fmt.Errorf("failed to cast to struct from %s", v.Type().Kind())
  424. }
  425. }