69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package cqrs
|
|
|
|
type CommandMiddleware func(next CommandHandler) CommandHandler
|
|
type QueryMiddleware func(next QueryHandler) QueryHandler
|
|
|
|
type Registry struct {
|
|
commands []*commandHandler
|
|
queries []*queryHandler
|
|
}
|
|
|
|
type commandHandler struct {
|
|
Match MatchFunc
|
|
Handler CommandHandler
|
|
Middlewares []CommandMiddleware
|
|
}
|
|
|
|
type queryHandler struct {
|
|
Match MatchFunc
|
|
Handler QueryHandler
|
|
Middlewares []QueryMiddleware
|
|
}
|
|
|
|
func (r *Registry) MatchCommand(cmd Command) (CommandHandler, []CommandMiddleware, error) {
|
|
// TODO cache matching to avoid unnecessary ops
|
|
for _, reg := range r.commands {
|
|
matches, err := reg.Match(cmd)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
if matches {
|
|
return reg.Handler, reg.Middlewares, nil
|
|
}
|
|
}
|
|
|
|
return nil, nil, ErrHandlerNotFound
|
|
}
|
|
|
|
func (r *Registry) MatchQuery(qry Query) (QueryHandler, []QueryMiddleware, error) {
|
|
// TODO cache matching to avoid unnecessary ops
|
|
for _, reg := range r.queries {
|
|
matches, err := reg.Match(qry)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
if matches {
|
|
return reg.Handler, reg.Middlewares, nil
|
|
}
|
|
}
|
|
|
|
return nil, nil, ErrHandlerNotFound
|
|
}
|
|
|
|
func (r *Registry) RegisterCommand(match MatchFunc, hdlr CommandHandler, mdlwrs ...CommandMiddleware) {
|
|
r.commands = append(r.commands, &commandHandler{match, hdlr, mdlwrs})
|
|
}
|
|
|
|
func (r *Registry) RegisterQuery(match MatchFunc, hdlr QueryHandler, mdlwrs ...QueryMiddleware) {
|
|
r.queries = append(r.queries, &queryHandler{match, hdlr, mdlwrs})
|
|
}
|
|
|
|
func NewRegistry() *Registry {
|
|
return &Registry{
|
|
commands: make([]*commandHandler, 0),
|
|
queries: make([]*queryHandler, 0),
|
|
}
|
|
}
|