caller.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package socketio
  2. import (
  3. "errors"
  4. "fmt"
  5. "reflect"
  6. )
  7. type caller struct {
  8. Func reflect.Value
  9. Args []reflect.Type
  10. NeedSocket bool
  11. }
  12. func newCaller(f interface{}) (*caller, error) {
  13. fv := reflect.ValueOf(f)
  14. if fv.Kind() != reflect.Func {
  15. return nil, fmt.Errorf("f is not func")
  16. }
  17. ft := fv.Type()
  18. if ft.NumIn() == 0 {
  19. return &caller{
  20. Func: fv,
  21. }, nil
  22. }
  23. args := make([]reflect.Type, ft.NumIn())
  24. for i, n := 0, ft.NumIn(); i < n; i++ {
  25. args[i] = ft.In(i)
  26. }
  27. needSocket := false
  28. if args[0].Name() == "Socket" {
  29. args = args[1:]
  30. needSocket = true
  31. }
  32. return &caller{
  33. Func: fv,
  34. Args: args,
  35. NeedSocket: needSocket,
  36. }, nil
  37. }
  38. func (c *caller) GetArgs() []interface{} {
  39. ret := make([]interface{}, len(c.Args))
  40. for i, argT := range c.Args {
  41. if argT.Kind() == reflect.Ptr {
  42. argT = argT.Elem()
  43. }
  44. v := reflect.New(argT)
  45. ret[i] = v.Interface()
  46. }
  47. return ret
  48. }
  49. func (c *caller) Call(so Socket, args []interface{}) []reflect.Value {
  50. var a []reflect.Value
  51. diff := 0
  52. if c.NeedSocket {
  53. diff = 1
  54. a = make([]reflect.Value, len(args)+1)
  55. a[0] = reflect.ValueOf(so)
  56. } else {
  57. a = make([]reflect.Value, len(args))
  58. }
  59. if len(args) != len(c.Args) {
  60. return []reflect.Value{reflect.ValueOf([]interface{}{}), reflect.ValueOf(errors.New("Arguments do not match"))}
  61. }
  62. for i, arg := range args {
  63. v := reflect.ValueOf(arg)
  64. if c.Args[i].Kind() != reflect.Ptr {
  65. if v.IsValid() {
  66. v = v.Elem()
  67. } else {
  68. v = reflect.Zero(c.Args[i])
  69. }
  70. }
  71. a[i+diff] = v
  72. }
  73. return c.Func.Call(a)
  74. }