Skip to content

Instantly share code, notes, and snippets.

@savaki
Created November 1, 2017 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save savaki/afd87416d85439066702e8051f04878b to your computer and use it in GitHub Desktop.
Save savaki/afd87416d85439066702e8051f04878b to your computer and use it in GitHub Desktop.
toy event source example
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/altairsix/eventsource"
)
// UserCreated defines a user creation event
type UserCreated struct {
eventsource.Model
}
// UserFirstSet defines an event by simple struct embedding
type UserNameSet struct {
eventsource.Model
Name string
}
// UserLastSet defines an event via tags
type UserEmailSet struct {
eventsource.Model
Email string
}
type User struct {
ID string
Version int
Name string
Email string
}
func (item *User) On(event eventsource.Event) error {
switch v := event.(type) {
case *UserCreated:
item.Version = v.Model.Version
item.ID = v.Model.ID
case *UserNameSet:
item.Version = v.Model.Version
item.Name = v.Name
case *UserEmailSet:
item.Version = v.Model.Version
item.Email = v.Email
default:
return fmt.Errorf("unhandled event, %v", v)
}
return nil
}
func main() {
serializer := eventsource.NewJSONSerializer(
UserCreated{},
UserNameSet{},
UserEmailSet{},
)
repo := eventsource.New(&User{},
eventsource.WithSerializer(serializer),
)
id := "123"
setNameEvent := &UserNameSet{
Model: eventsource.Model{ID: id, Version: 1},
Name: "Joe Public",
}
setEmailEvent := &UserEmailSet{
ID: id,
Version: 2,
Email: "joe.public@example.com",
}
ctx := context.Background()
err := repo.Save(ctx, setEmailEvent, setNameEvent)
if err != nil {
log.Fatalln(err)
}
v, err := repo.Load(ctx, id)
if err != nil {
log.Fatalln(err)
}
user := v.(*User)
fmt.Printf("Hello %v %v\n", user.Name, user.Email) // prints "Hello Joe Public joe.public@example.com"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment