-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent.go
131 lines (110 loc) · 2.42 KB
/
event.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package event
import (
"fmt"
"encoding/gob"
)
// ID TODO
type ID [16]byte
func (id ID) Byte() []byte {
return id[:]
}
// ZeroID TODO
func ZeroID() ID {
return [16]byte{}
}
func MaxID() ID {
return GenerateTimeID(^uint64(0), ^uint64(0))
}
// EventType TODO
type EventType string
func (e EventType) String() string {
return string(e)
}
// Event TODO
type Event interface {
ID() ID
Type() EventType
Time() uint64
}
// BaseEvent TODO
type BaseEvent struct {
EventID ID
EventTime uint64
}
// ID TODO
func (e *BaseEvent) ID() ID {
return e.EventID
}
// Time TODO
func (e *BaseEvent) Time() uint64 {
return e.EventTime
}
// Dispatcher TODO
type Dispatcher struct {
Middlewares []Middleware
Store *Store
Handlers map[EventType] HandlerFunc
}
// NewDispatcher TODO
func NewDispatcher(s *Store) *Dispatcher {
dispatcher := Dispatcher{
Store: s,
}
dispatcher.Handlers = map[EventType]HandlerFunc{}
return &dispatcher
}
// Dispatch TODO
func (d *Dispatcher) Dispatch(event Event) error{
for _, m := range d.Middlewares {
m.Do(event)
}
return d.Handle(event)
}
// Register TODO
func (d *Dispatcher) Register(event Event, handler HandlerFunc) {
gob.Register(event)
d.Handlers[event.Type()] = handler
}
// Handle should not be called externally, use Dispatch instead, this function gives the possibility to avoid the middleware
func (d *Dispatcher) Handle(event Event) error{
handler, ok := d.Handlers[event.Type()]
if !ok {
return fmt.Errorf("Event with type: %s has no handler", event.Type())
}
handler(event, d.Store)
d.Store.LastEvent = event
d.Store.Time = event.Time()
return nil
}
// SetMiddleware TODO
func (d *Dispatcher) SetMiddleware(m ...Middleware) {
d.Middlewares = m
}
// Middleware TODO
type Middleware interface{
Do(event Event)
}
// MiddlewareFunc TODO
type MiddlewareFunc func(e Event)
// Do TODO
func (m MiddlewareFunc) Do(e Event) {
m(e)
}
// HandlerFunc TODO
type HandlerFunc func(event Event, store *Store)
// Store TODO
type Store struct {
LastEvent Event
Time uint64
Attributes interface{}
}
func (s *Store) NextID() uint64 {
return s.LastEvent.ID().IDPart()+1
}
// NewStore accepts your attribute stores and wraps it in an event.Store object
func NewStore(store interface{}) *Store {
gob.Register(store)
return &Store {
Attributes: store,
}
}