This is an attempt a building a somewhat generic commands, queries and events framework in go.
Example set up below..
package main
import (
"log"
"os"
"testing"
"github.com/TomPallister/spitfire"
)
func main(){
logger = log.New(os.Stdout, "Log: ", log.Ldate|log.Ltime|log.Lshortfile)
handler = spitfire.New(logger)
}
A message is a command, query or event and these can in theory be any struct but in reality they should be simple dtos.
Each command can only have one handler. Register a command handler like below
handler.RegisterCommandHandler(createAccount{}, createAccountHandler)
Command handlers have the following interface
type CommandHandler = func(interface{}) (interface{}, error)
Each event can have multiple handlers. Register event handlers like below
handler.RegisterEventHandler(accountCreated{}, incrementAccountCreatedCount)
handler.RegisterEventHandler(accountCreated{}, addAccountToCache)
Event handlers have the following interface
type EventHandler = func(interface{}) error
Each query can only have one handler. Register a query handler like below
handler.RegisterQueryHandler(getAccount{}, getAccountHandler)
Query handlers have the following interface
type QueryHandler = func(interface{}) (interface{}, error)
In order to call your command/query and any subsequent event handlers you can do the following. Due to go's lack of generics you need to cast the result you get back as an interface to your expected response type. Obviously how you call this is up to you.
result, err := handler.Handle(createAccount{UserID: 1})
if len(err) == 0 {
acr := result.(accountCreated)
accountCreatedResult = &acr
}
errors = err
To understand spitfire fully please take a look at the test class and the code itself. It's not complex.