mirror of
https://github.com/grafana/grafana.git
synced 2025-09-27 00:03:44 +08:00
Refactored command/query interface
This commit is contained in:
@ -9,19 +9,26 @@ import (
|
|||||||
type QueryHandler interface{}
|
type QueryHandler interface{}
|
||||||
type Query interface{}
|
type Query interface{}
|
||||||
|
|
||||||
var (
|
type Bus interface {
|
||||||
handlerIndex map[string]QueryHandler
|
SendQuery(query Query) error
|
||||||
)
|
AddQueryHandler(handler QueryHandler)
|
||||||
|
|
||||||
func InitBus() {
|
|
||||||
handlerIndex = make(map[string]QueryHandler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendQuery(query interface{}) error {
|
type InProcBus struct {
|
||||||
|
handlerIndex map[string]QueryHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() Bus {
|
||||||
|
bus := &InProcBus{}
|
||||||
|
bus.handlerIndex = make(map[string]QueryHandler)
|
||||||
|
return bus
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *InProcBus) SendQuery(query Query) error {
|
||||||
var queryName = reflect.TypeOf(query).Elem().Name()
|
var queryName = reflect.TypeOf(query).Elem().Name()
|
||||||
fmt.Printf("sending query for type: %v\n", queryName)
|
fmt.Printf("sending query for type: %v\n", queryName)
|
||||||
|
|
||||||
var handler = handlerIndex[queryName]
|
var handler = b.handlerIndex[queryName]
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
return errors.New("handler not found")
|
return errors.New("handler not found")
|
||||||
|
|
||||||
@ -38,10 +45,9 @@ func SendQuery(query interface{}) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddQueryHandler(handler QueryHandler) {
|
func (b *InProcBus) AddQueryHandler(handler QueryHandler) {
|
||||||
handlerType := reflect.TypeOf(handler)
|
handlerType := reflect.TypeOf(handler)
|
||||||
queryTypeName := handlerType.In(0).Elem().Name()
|
queryTypeName := handlerType.In(0).Elem().Name()
|
||||||
fmt.Printf("QueryType %v\n", queryTypeName)
|
fmt.Printf("QueryType %v\n", queryTypeName)
|
||||||
handlerIndex[queryTypeName] = handler
|
b.handlerIndex[queryTypeName] = handler
|
||||||
//fmt.Printf("Adding handler for type: %v\n", queryTypeName)
|
|
||||||
}
|
}
|
||||||
|
@ -11,13 +11,13 @@ type TestQuery struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestHandlerReturnsError(t *testing.T) {
|
func TestHandlerReturnsError(t *testing.T) {
|
||||||
InitBus()
|
bus := New()
|
||||||
|
|
||||||
AddQueryHandler(func(query *TestQuery) error {
|
bus.AddQueryHandler(func(query *TestQuery) error {
|
||||||
return errors.New("handler error")
|
return errors.New("handler error")
|
||||||
})
|
})
|
||||||
|
|
||||||
err := SendQuery(&TestQuery{})
|
err := bus.SendQuery(&TestQuery{})
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("Send query failed %v", err)
|
t.Fatal("Send query failed %v", err)
|
||||||
@ -27,15 +27,15 @@ func TestHandlerReturnsError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestHandlerReturn(t *testing.T) {
|
func TestHandlerReturn(t *testing.T) {
|
||||||
InitBus()
|
bus := New()
|
||||||
|
|
||||||
AddQueryHandler(func(q *TestQuery) error {
|
bus.AddQueryHandler(func(q *TestQuery) error {
|
||||||
q.Resp = "hello from handler"
|
q.Resp = "hello from handler"
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
query := &TestQuery{}
|
query := &TestQuery{}
|
||||||
err := SendQuery(query)
|
err := bus.SendQuery(query)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("Send query failed %v", err)
|
t.Fatal("Send query failed %v", err)
|
||||||
|
Reference in New Issue
Block a user