inklabs/rangedb

View on GitHub
pkg/aggregategenerator/write_aggregate.go

Summary

Maintainability
A
0 mins
Test Coverage
A
93%
package aggregategenerator
 
import (
"fmt"
"io"
"text/template"
"time"
"unicode"
)
 
var NowFunc = time.Now
 
// Write generates the boilerplate aggregate Go code required for the cqrs package.
func Write(out io.Writer, pkg, aggregateName string, commands, events []string) error {
if len(commands)+len(events) < 1 {
return fmt.Errorf("no commands or events found")
}
 
return fileTemplate.Execute(out, templateData{
Timestamp: NowFunc(),
Commands: commands,
Events: events,
AggregateName: aggregateName,
Package: pkg,
})
}
 
type templateData struct {
Timestamp time.Time
Commands []string
Events []string
AggregateName string
Package string
}
 
func lcFirst(str string) string {
for i, v := range str {
return string(unicode.ToLower(v)) + str[i+1:]
}
return ""
}
 
var funcMap = template.FuncMap{
"LcFirst": lcFirst,
}
 
var fileTemplate = template.Must(template.New("").Funcs(funcMap).Parse(`// Code generated by go generate; DO NOT EDIT.
// This file was generated at
// {{ .Timestamp }}
package {{ $.Package }}
 
import (
"github.com/inklabs/rangedb"
"github.com/inklabs/rangedb/pkg/cqrs"
)
 
func (a *{{ .AggregateName }}) Load(recordIterator rangedb.RecordIterator) {
for recordIterator.Next() {
{{- if .Events }}
if recordIterator.Err() == nil {
if event, ok := recordIterator.Record().Data.(rangedb.Event); ok {
a.apply(event)
}
}
{{- end }}
}
}
 
{{- if .Events }}
 
func (a *{{ .AggregateName }}) apply(event rangedb.Event) {
switch e := event.(type) {
{{- range .Events }}
 
case {{ . }}:
a.{{ . | LcFirst }}(e)
 
case *{{ . }}:
a.{{ . | LcFirst }}(*e)
{{- end }}
 
}
}
{{- end }}
 
func (a *{{ .AggregateName }}) Handle(command cqrs.Command) []rangedb.Event {
{{- if .Commands }}
switch c := command.(type) {
{{- range .Commands }}
 
case {{ . }}:
a.{{ . | LcFirst }}(c)
 
case *{{ . }}:
a.{{ . | LcFirst }}(*c)
{{- end }}
 
}
{{ end }}
defer a.resetPendingEvents()
return a.pendingEvents
}
 
func (a *{{ .AggregateName }}) resetPendingEvents() {
a.pendingEvents = nil
}
 
func (a *{{ .AggregateName }}) CommandTypes() []string {
return []string{
{{- range .Commands }}
{{ . }}{}.CommandType(),
{{- end }}
}
}
 
func (a *{{ .AggregateName }}) raise(events ...rangedb.Event) {
a.pendingEvents = append(a.pendingEvents, events...)
}
`))