Bus experiment

This commit is contained in:
Torkel Ödegaard
2014-11-28 22:16:49 +01:00
parent a799fac983
commit 246f41b88a
6 changed files with 95 additions and 283 deletions
+47
View File
@@ -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)
}
+45
View File
@@ -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")
}
}