Skip to content

TomPallister/spitfire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

spitfire

This is an attempt a building a somewhat generic commands, queries and events framework in go.

How to

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)
}

Messages

A message is a command, query or event and these can in theory be any struct but in reality they should be simple dtos.

Commands

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)

Events

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

Queries

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)

Calling the handlers

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

Further reading

To understand spitfire fully please take a look at the test class and the code itself. It's not complex.

About

Attempt at CQRS and Events using go...

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages