Bus experiment
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package bus
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
type QueryHandler interface{}
|
||||
type Query interface{}
|
||||
|
||||
var (
|
||||
handlerIndex map[string]QueryHandler
|
||||
)
|
||||
|
||||
func InitBus() {
|
||||
handlerIndex = make(map[string]QueryHandler)
|
||||
}
|
||||
|
||||
func SendQuery(query interface{}) error {
|
||||
var queryName = reflect.TypeOf(query).Elem().Name()
|
||||
fmt.Printf("sending query for type: %v\n", queryName)
|
||||
|
||||
var handler = handlerIndex[queryName]
|
||||
if handler == nil {
|
||||
return errors.New("handler not found")
|
||||
|
||||
}
|
||||
var params = make([]reflect.Value, 1)
|
||||
params[0] = reflect.ValueOf(query)
|
||||
|
||||
ret := reflect.ValueOf(handler).Call(params)
|
||||
err := ret[0].Interface()
|
||||
if err == nil {
|
||||
return nil
|
||||
} else {
|
||||
return err.(error)
|
||||
}
|
||||
}
|
||||
|
||||
func AddQueryHandler(handler QueryHandler) {
|
||||
handlerType := reflect.TypeOf(handler)
|
||||
queryTypeName := handlerType.In(0).Elem().Name()
|
||||
fmt.Printf("QueryType %v\n", queryTypeName)
|
||||
handlerIndex[queryTypeName] = handler
|
||||
//fmt.Printf("Adding handler for type: %v\n", queryTypeName)
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package bus
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type TestQuery struct {
|
||||
Id int64
|
||||
Resp string
|
||||
}
|
||||
|
||||
func TestHandlerReturnsError(t *testing.T) {
|
||||
InitBus()
|
||||
|
||||
AddQueryHandler(func(query *TestQuery) error {
|
||||
return errors.New("handler error")
|
||||
})
|
||||
|
||||
err := SendQuery(&TestQuery{})
|
||||
|
||||
if err == nil {
|
||||
t.Fatal("Send query failed %v", err)
|
||||
} else {
|
||||
t.Log("Handler error received ok")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandlerReturn(t *testing.T) {
|
||||
InitBus()
|
||||
|
||||
AddQueryHandler(func(q *TestQuery) error {
|
||||
q.Resp = "hello from handler"
|
||||
return nil
|
||||
})
|
||||
|
||||
query := &TestQuery{}
|
||||
err := SendQuery(query)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal("Send query failed %v", err)
|
||||
} else if query.Resp != "hello from handler" {
|
||||
t.Fatal("Failed to get response from handler")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user