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.

376 lines
12 KiB

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