bus.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package bus
  2. import (
  3. "errors"
  4. "reflect"
  5. )
  6. type HandlerFunc interface{}
  7. type Msg interface{}
  8. type Bus interface {
  9. Dispatch(msg Msg) error
  10. Publish(msg Msg) error
  11. AddHandler(handler HandlerFunc)
  12. AddEventListener(handler HandlerFunc)
  13. }
  14. type InProcBus struct {
  15. handlers map[string]HandlerFunc
  16. listeners map[string][]HandlerFunc
  17. }
  18. // temp stuff, not sure how to handle bus instance, and init yet
  19. var globalBus = New()
  20. func New() Bus {
  21. bus := &InProcBus{}
  22. bus.handlers = make(map[string]HandlerFunc)
  23. bus.listeners = make(map[string][]HandlerFunc)
  24. return bus
  25. }
  26. func (b *InProcBus) Dispatch(msg Msg) error {
  27. var msgName = reflect.TypeOf(msg).Elem().Name()
  28. var handler = b.handlers[msgName]
  29. if handler == nil {
  30. return errors.New("handler not found")
  31. }
  32. var params = make([]reflect.Value, 1)
  33. params[0] = reflect.ValueOf(msg)
  34. ret := reflect.ValueOf(handler).Call(params)
  35. err := ret[0].Interface()
  36. if err == nil {
  37. return nil
  38. } else {
  39. return err.(error)
  40. }
  41. }
  42. func (b *InProcBus) Publish(msg Msg) error {
  43. var msgName = reflect.TypeOf(msg).Elem().Name()
  44. var listeners = b.listeners[msgName]
  45. if len(listeners) == 0 {
  46. return nil
  47. }
  48. var params = make([]reflect.Value, 1)
  49. params[0] = reflect.ValueOf(msg)
  50. for listenerHandler := range listeners {
  51. ret := reflect.ValueOf(listenerHandler).Call(params)
  52. err := ret[0].Interface()
  53. if err != nil {
  54. return err.(error)
  55. }
  56. }
  57. return nil
  58. }
  59. func (b *InProcBus) AddHandler(handler HandlerFunc) {
  60. handlerType := reflect.TypeOf(handler)
  61. queryTypeName := handlerType.In(0).Elem().Name()
  62. b.handlers[queryTypeName] = handler
  63. }
  64. func (b *InProcBus) AddEventListener(handler HandlerFunc) {
  65. handlerType := reflect.TypeOf(handler)
  66. eventName := handlerType.In(0).Elem().Name()
  67. list, exists := b.listeners[eventName]
  68. if !exists {
  69. list = make([]HandlerFunc, 0)
  70. b.listeners[eventName] = list
  71. }
  72. list = append(list, handler)
  73. }
  74. // Package level functions
  75. func AddHandler(implName string, handler HandlerFunc) {
  76. globalBus.AddHandler(handler)
  77. }
  78. // Package level functions
  79. func AddEventListener(handler HandlerFunc) {
  80. globalBus.AddEventListener(handler)
  81. }
  82. func Dispatch(msg Msg) error {
  83. return globalBus.Dispatch(msg)
  84. }