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.

58 lines
1.4 KiB

3 years ago
3 years ago
3 years ago
  1. package rpc
  2. import (
  3. "errors"
  4. "fmt"
  5. "reflect"
  6. )
  7. type MethodInvoker struct {
  8. call func([]reflect.Value) []reflect.Value
  9. parameterParsers []valueParser
  10. }
  11. func NewMethodInvoker(call func([]reflect.Value) []reflect.Value, parameterParsers []valueParser) *MethodInvoker {
  12. return &MethodInvoker{call, parameterParsers}
  13. }
  14. func (invoker *MethodInvoker) parseParameters(jsonArray []interface{}) ([]reflect.Value, error) {
  15. parsers := invoker.parameterParsers
  16. count := len(parsers)
  17. if len(jsonArray) != count {
  18. return nil, errors.New(fmt.Sprintf("参数长度错误!"))
  19. } else {
  20. parameterValues := make([]reflect.Value, count)
  21. for i, parser := range parsers {
  22. if parameter, err := parser(jsonArray[i], fmt.Sprintf("#%d", i+1)); err != nil {
  23. return nil, err
  24. } else {
  25. parameterValues[i] = reflect.ValueOf(parameter)
  26. }
  27. }
  28. return parameterValues, nil
  29. }
  30. }
  31. func (invoker *MethodInvoker) Process(jsonArray []interface{}) (interface{}, error) {
  32. if parameterValues, err := invoker.parseParameters(jsonArray); err != nil {
  33. return nil, err
  34. } else {
  35. returnValues := invoker.call(parameterValues)
  36. var err interface{}
  37. var result interface{}
  38. if len(returnValues) > 1 {
  39. err = returnValues[1].Interface()
  40. result = returnValues[0].Interface()
  41. } else {
  42. err = returnValues[0].Interface()
  43. result = nil
  44. }
  45. if err != nil {
  46. return nil, err.(error)
  47. } else {
  48. return result, nil
  49. }
  50. }
  51. }