bus.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package bus
  2. import (
  3. "errors"
  4. "fmt"
  5. "reflect"
  6. )
  7. type QueryHandler interface{}
  8. type Query interface{}
  9. type Bus interface {
  10. SendQuery(query Query) error
  11. AddQueryHandler(handler QueryHandler)
  12. }
  13. type InProcBus struct {
  14. handlerIndex map[string]QueryHandler
  15. }
  16. func New() Bus {
  17. bus := &InProcBus{}
  18. bus.handlerIndex = make(map[string]QueryHandler)
  19. return bus
  20. }
  21. func (b *InProcBus) SendQuery(query Query) error {
  22. var queryName = reflect.TypeOf(query).Elem().Name()
  23. fmt.Printf("sending query for type: %v\n", queryName)
  24. var handler = b.handlerIndex[queryName]
  25. if handler == nil {
  26. return errors.New("handler not found")
  27. }
  28. var params = make([]reflect.Value, 1)
  29. params[0] = reflect.ValueOf(query)
  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) AddQueryHandler(handler QueryHandler) {
  39. handlerType := reflect.TypeOf(handler)
  40. queryTypeName := handlerType.In(0).Elem().Name()
  41. fmt.Printf("QueryType %v\n", queryTypeName)
  42. b.handlerIndex[queryTypeName] = handler
  43. }