bus.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. AddHandler(handler HandlerFunc)
  11. }
  12. type InProcBus struct {
  13. handlers map[string]HandlerFunc
  14. }
  15. // temp stuff, not sure how to handle bus instance, and init yet
  16. var globalBus = New()
  17. func New() Bus {
  18. bus := &InProcBus{}
  19. bus.handlers = make(map[string]HandlerFunc)
  20. return bus
  21. }
  22. func (b *InProcBus) Dispatch(msg Msg) error {
  23. var msgName = reflect.TypeOf(msg).Elem().Name()
  24. var handler = b.handlers[msgName]
  25. if handler == nil {
  26. return errors.New("handler not found")
  27. }
  28. var params = make([]reflect.Value, 1)
  29. params[0] = reflect.ValueOf(msg)
  30. ret := reflect.ValueOf(handler).Call(params)
  31. err := ret[0].Interface()
  32. if err == nil {
  33. return nil
  34. } else {
  35. return err.(error)
  36. }
  37. }
  38. func (b *InProcBus) AddHandler(handler HandlerFunc) {
  39. handlerType := reflect.TypeOf(handler)
  40. queryTypeName := handlerType.In(0).Elem().Name()
  41. b.handlers[queryTypeName] = handler
  42. }
  43. // Package level functions
  44. func AddHandler(implName string, handler HandlerFunc) {
  45. globalBus.AddHandler(handler)
  46. }
  47. func Dispatch(msg Msg) error {
  48. return globalBus.Dispatch(msg)
  49. }