高级排程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
11 KiB

  1. package rpc
  2. import (
  3. "errors"
  4. "fmt"
  5. "reflect"
  6. )
  7. var stringType = reflect.TypeOf("")
  8. type ValueParserBuilder struct {
  9. }
  10. func (builder *ValueParserBuilder) parseJsonBoolean(jsonValue interface{}, valueName string) (interface{}, error) {
  11. if jsonValue == nil {
  12. return nil, errors.New(fmt.Sprintf("%s 不能为空!", valueName))
  13. } else if value, ok := jsonValue.(bool); !ok {
  14. return nil, errors.New(fmt.Sprintf("%s 无法解析!源类型:%v,目标类型:Bool.", valueName, reflect.TypeOf(jsonValue)))
  15. } else {
  16. return value, nil
  17. }
  18. }
  19. func (builder *ValueParserBuilder) parseJsonString(jsonValue interface{}, valueName string) (interface{}, error) {
  20. if jsonValue == nil {
  21. return "", nil
  22. } else if value, ok := jsonValue.(string); !ok {
  23. return nil, errors.New(fmt.Sprintf("%s 无法解析!源类型:%v,目标类型:String.", valueName, reflect.TypeOf(jsonValue)))
  24. } else {
  25. return value, nil
  26. }
  27. }
  28. func (builder *ValueParserBuilder) parseJsonNumber(jsonValue interface{}, valueName string) (float64, error) {
  29. if jsonValue == nil {
  30. return 0, errors.New(fmt.Sprintf("%s 不能为空!", valueName))
  31. } else if value, ok := jsonValue.(float64); !ok {
  32. return 0, errors.New(fmt.Sprintf("%s 无法解析!源类型:%v,目标类型:Number.", valueName, reflect.TypeOf(jsonValue)))
  33. } else {
  34. return value, nil
  35. }
  36. }
  37. func (builder *ValueParserBuilder) parseJsonArray(jsonValue interface{}, valueName string) ([]interface{}, error) {
  38. if jsonValue == nil {
  39. return nil, errors.New(fmt.Sprintf("%s 不能为空!", valueName))
  40. } else if items, ok := jsonValue.([]interface{}); !ok {
  41. return nil, errors.New(fmt.Sprintf("%s 无法解析!源类型:%v,目标类型:Array.", valueName, reflect.TypeOf(jsonValue)))
  42. } else {
  43. return items, nil
  44. }
  45. }
  46. func (builder *ValueParserBuilder) parseJsonObject(jsonValue interface{}, valueName string) (map[string]interface{}, error) {
  47. if jsonValue == nil {
  48. return nil, errors.New(fmt.Sprintf("%s 不能为空!", valueName))
  49. } else if jsonObject, ok := jsonValue.(map[string]interface{}); !ok {
  50. return nil, errors.New(fmt.Sprintf("%s 无法解析!源类型:%v,目标类型:Object.", valueName, reflect.TypeOf(jsonValue)))
  51. } else {
  52. return jsonObject, nil
  53. }
  54. }
  55. func (builder *ValueParserBuilder) parseUnsignedInteger(jsonValue interface{}, valueName string) (interface{}, error) {
  56. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  57. return nil, err
  58. } else {
  59. return uint(value), nil
  60. }
  61. }
  62. func (builder *ValueParserBuilder) parseUnsignedInteger8(jsonValue interface{}, valueName string) (interface{}, error) {
  63. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  64. return nil, err
  65. } else {
  66. return uint8(value), nil
  67. }
  68. }
  69. func (builder *ValueParserBuilder) parseUnsignedInteger16(jsonValue interface{}, valueName string) (interface{}, error) {
  70. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  71. return nil, err
  72. } else {
  73. return uint16(value), nil
  74. }
  75. }
  76. func (builder *ValueParserBuilder) parseUnsignedInteger32(jsonValue interface{}, valueName string) (interface{}, error) {
  77. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  78. return nil, err
  79. } else {
  80. return uint32(value), nil
  81. }
  82. }
  83. func (builder *ValueParserBuilder) parseUnsignedInteger64(jsonValue interface{}, valueName string) (interface{}, error) {
  84. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  85. return nil, err
  86. } else {
  87. return uint64(value), nil
  88. }
  89. }
  90. func (builder *ValueParserBuilder) parseInteger(jsonValue interface{}, valueName string) (interface{}, error) {
  91. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  92. return nil, err
  93. } else {
  94. return int(value), nil
  95. }
  96. }
  97. func (builder *ValueParserBuilder) parseInteger8(jsonValue interface{}, valueName string) (interface{}, error) {
  98. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  99. return nil, err
  100. } else {
  101. return int8(value), nil
  102. }
  103. }
  104. func (builder *ValueParserBuilder) parseInteger16(jsonValue interface{}, valueName string) (interface{}, error) {
  105. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  106. return nil, err
  107. } else {
  108. return int16(value), nil
  109. }
  110. }
  111. func (builder *ValueParserBuilder) parseInteger32(jsonValue interface{}, valueName string) (interface{}, error) {
  112. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  113. return nil, err
  114. } else {
  115. return int32(value), nil
  116. }
  117. }
  118. func (builder *ValueParserBuilder) parseInteger64(jsonValue interface{}, valueName string) (interface{}, error) {
  119. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  120. return nil, err
  121. } else {
  122. return int64(value), nil
  123. }
  124. }
  125. func (builder *ValueParserBuilder) parseFloat32(jsonValue interface{}, valueName string) (interface{}, error) {
  126. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  127. return nil, err
  128. } else {
  129. return float32(value), nil
  130. }
  131. }
  132. func (builder *ValueParserBuilder) parseFloat64(jsonValue interface{}, valueName string) (interface{}, error) {
  133. if value, err := builder.parseJsonNumber(jsonValue, valueName); err != nil {
  134. return nil, err
  135. } else {
  136. return value, nil
  137. }
  138. }
  139. func (builder *ValueParserBuilder) buildMapParser(valueParser valueParser, valueType reflect.Type) valueParser {
  140. return func(jsonValue interface{}, valueName string) (interface{}, error) {
  141. if jsonObject, err := builder.parseJsonObject(jsonValue, valueName); err != nil {
  142. return reflect.Zero(reflect.MapOf(stringType, valueType)).Interface(), nil
  143. } else {
  144. result := reflect.MakeMapWithSize(reflect.MapOf(stringType, valueType), len(jsonObject))
  145. for key, value := range jsonObject {
  146. if value, err := valueParser(value, fmt.Sprintf("%s[%s]", valueName, key)); err != nil {
  147. return nil, err
  148. } else {
  149. result.SetMapIndex(reflect.ValueOf(key), reflect.ValueOf(value))
  150. }
  151. }
  152. return result.Interface(), nil
  153. }
  154. }
  155. }
  156. func (builder *ValueParserBuilder) buildSliceParser(itemParser valueParser, elementType reflect.Type) valueParser {
  157. return func(jsonValue interface{}, valueName string) (interface{}, error) {
  158. if jsonArray, err := builder.parseJsonArray(jsonValue, valueName); err != nil {
  159. return reflect.Zero(reflect.SliceOf(elementType)).Interface(), nil
  160. } else {
  161. slice := reflect.MakeSlice(reflect.SliceOf(elementType), len(jsonArray), len(jsonArray))
  162. for index, item := range jsonArray {
  163. if value, err := itemParser(item, fmt.Sprintf("%s[%d]", valueName, index)); err != nil {
  164. return nil, err
  165. } else {
  166. slice.Index(index).Set(reflect.ValueOf(value))
  167. }
  168. }
  169. return slice.Interface(), nil
  170. }
  171. }
  172. }
  173. func (builder *ValueParserBuilder) buildArrayParser(itemParser valueParser, length int, elementType reflect.Type) valueParser {
  174. return func(jsonValue interface{}, valueName string) (interface{}, error) {
  175. if jsonArray, err := builder.parseJsonArray(jsonValue, valueName); err != nil {
  176. return nil, err
  177. } else if len(jsonArray) != length {
  178. return nil, errors.New(fmt.Sprintf("%s 数组长度匹配!期望长度:%d,实际长度:%d.", valueName, length, len(jsonArray)))
  179. } else {
  180. array := reflect.New(reflect.ArrayOf(length, elementType)).Elem()
  181. for index := 0; index < length; index++ {
  182. if value, err := itemParser(jsonArray[index], fmt.Sprintf("%s[%d]", valueName, index)); err != nil {
  183. return nil, err
  184. } else {
  185. array.Index(index).Set(reflect.ValueOf(value))
  186. }
  187. }
  188. return array.Interface(), nil
  189. }
  190. }
  191. }
  192. func (builder *ValueParserBuilder) buildPointerParser(itemParser valueParser, elementType reflect.Type) valueParser {
  193. return func(jsonValue interface{}, valueName string) (interface{}, error) {
  194. if jsonValue == nil {
  195. return reflect.Zero(reflect.PtrTo(elementType)).Interface(), nil
  196. } else if value, err := itemParser(jsonValue, valueName); err != nil {
  197. return nil, err
  198. } else {
  199. pointer := reflect.New(elementType)
  200. pointer.Elem().Set(reflect.ValueOf(value))
  201. return pointer.Interface(), nil
  202. }
  203. }
  204. }
  205. func (builder *ValueParserBuilder) buildStructParser(valueID string, structType reflect.Type) (valueParser, error) {
  206. fieldCount := structType.NumField()
  207. parsers := make(map[string]valueParser, fieldCount)
  208. for i := 0; i < fieldCount; i++ {
  209. field := structType.Field(i)
  210. if parameterParser, err := builder.Build(fmt.Sprintf("%s.%s", valueID, field.Name), field.Type); err != nil {
  211. return nil, err
  212. } else {
  213. parsers[field.Name] = parameterParser
  214. }
  215. }
  216. return func(jsonValue interface{}, valueName string) (interface{}, error) {
  217. structValue := reflect.New(structType).Elem()
  218. for fieldName, parser := range parsers {
  219. field := structValue.FieldByName(fieldName)
  220. if !field.IsValid() {
  221. return nil, errors.New(fmt.Sprintf("%s 没有找到字段:%v.%s", valueName, structType, fieldName))
  222. }
  223. if jsonObject, err := builder.parseJsonObject(jsonValue, valueName); err != nil {
  224. return nil, err
  225. } else if value, err := parser(jsonObject[fieldName], fmt.Sprintf("%s.%s", valueName, fieldName)); err != nil {
  226. return nil, err
  227. } else {
  228. field.Set(reflect.ValueOf(value))
  229. }
  230. }
  231. return structValue.Interface(), nil
  232. }, nil
  233. }
  234. func (builder *ValueParserBuilder) Build(valueID string, valueType reflect.Type) (valueParser, error) {
  235. switch valueType.Kind() {
  236. //case reflect.Invalid:
  237. case reflect.Bool:
  238. return builder.parseJsonBoolean, nil
  239. case reflect.Int:
  240. return builder.parseInteger, nil
  241. case reflect.Int8:
  242. return builder.parseInteger8, nil
  243. case reflect.Int16:
  244. return builder.parseInteger16, nil
  245. case reflect.Int32:
  246. return builder.parseInteger32, nil
  247. case reflect.Int64:
  248. return builder.parseInteger64, nil
  249. case reflect.Uint:
  250. return builder.parseUnsignedInteger, nil
  251. case reflect.Uint8:
  252. return builder.parseUnsignedInteger8, nil
  253. case reflect.Uint16:
  254. return builder.parseUnsignedInteger16, nil
  255. case reflect.Uint32:
  256. return builder.parseUnsignedInteger32, nil
  257. case reflect.Uint64:
  258. return builder.parseUnsignedInteger64, nil
  259. //case reflect.Uintptr:
  260. case reflect.Float32:
  261. return builder.parseFloat32, nil
  262. case reflect.Float64:
  263. return builder.parseFloat64, nil
  264. //case reflect.Complex64:
  265. //case reflect.Complex128:
  266. case reflect.Array:
  267. parser, err := builder.Build(valueID, valueType.Elem())
  268. if err != nil {
  269. return nil, err
  270. } else {
  271. return builder.buildArrayParser(parser, valueType.Len(), valueType.Elem()), nil
  272. }
  273. //case reflect.Chan:
  274. //case reflect.Func:
  275. //case reflect.Interface:
  276. case reflect.Map:
  277. if valueType.Key().Kind() != reflect.String {
  278. return nil, errors.New(fmt.Sprintf("*map[%s]%s", valueType.Key().Name(), valueType.Elem().Name()))
  279. }
  280. valuerParser, err := builder.Build(valueID, valueType.Elem())
  281. if err != nil {
  282. return nil, err
  283. } else {
  284. return builder.buildMapParser(valuerParser, valueType.Elem()), nil
  285. }
  286. case reflect.Ptr:
  287. parser, err := builder.Build(valueID, valueType.Elem())
  288. if err != nil {
  289. return nil, err
  290. } else {
  291. return builder.buildPointerParser(parser, valueType.Elem()), nil
  292. }
  293. case reflect.Slice:
  294. parser, err := builder.Build(valueID, valueType.Elem())
  295. if err != nil {
  296. return nil, err
  297. } else {
  298. return builder.buildSliceParser(parser, valueType.Elem()), nil
  299. }
  300. case reflect.String:
  301. return builder.parseJsonString, nil
  302. case reflect.Struct:
  303. parser, err := builder.buildStructParser(valueID, valueType)
  304. if err != nil {
  305. return nil, err
  306. } else {
  307. return parser, nil
  308. }
  309. //case reflect.UnsafePointer:
  310. default:
  311. return nil, errors.New(fmt.Sprintf("不支持的类型: %s.%s", valueID, valueType.Name()))
  312. }
  313. }