-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathevent.go
95 lines (72 loc) · 2.34 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
package theta
import (
"context"
"encoding/json"
"fmt"
"time"
"gopkg.in/go-playground/validator.v9"
)
//go:generate counterfeiter -generate
var validation = validator.New()
//counterfeiter:generate -o ./fake/event_handler.go . EventHandler
// EventHandler represents the event's handler
type EventHandler interface {
// HandleContext handles event
HandleContext(ctx context.Context, args *EventArgs) error
}
var _ EventHandler = CompositeEventHandler{}
// CompositeEventHandler composes the event handler
type CompositeEventHandler []EventHandler
// HandleContext handles event
func (h CompositeEventHandler) HandleContext(ctx context.Context, args *EventArgs) error {
for _, handler := range h {
if err := handler.HandleContext(ctx, args); err != nil {
return err
}
}
return nil
}
var _ EventHandler = DictionaryEventHandler{}
// DictionaryEventHandler represents a dictionary of event handler
type DictionaryEventHandler map[string]EventHandler
// HandleContext handles event
func (h DictionaryEventHandler) HandleContext(ctx context.Context, args *EventArgs) error {
handler, ok := h[args.Event.Name]
if !ok {
return fmt.Errorf("event handler %v not found", args.Event.Name)
}
return handler.HandleContext(ctx, args)
}
// EventArgs is the actual event
type EventArgs struct {
Event *Event `json:"event" validate:"required"`
Meta Metadata `json:"meta" validate:"-"`
Body json.RawMessage `json:"body" validate:"required"`
}
// Event represents a event's information
type Event struct {
ID string `json:"id" validate:"required"`
Name string `json:"name" validate:"required"`
Source string `json:"source" validate:"required"`
Sender string `json:"sender" validate:"required"`
Timestamp time.Time `json:"timestamp" validate:"required"`
}
// Metadata information
type Metadata map[string]string
// Get returns a value for given key
func (m Metadata) Get(key string) string {
if value, ok := m[key]; ok {
return value
}
return ""
}
//counterfeiter:generate -o ./fake/event_decoder.go . EventDecoder
// EventDecoder represents an event decoder
type EventDecoder interface {
Decode([]byte, interface{}) error
}
//counterfeiter:generate -o ./fake/event_encoder.go . EventEncoder
// EventEncoder represents an event decoder
type EventEncoder interface {
Encode(interface{}) ([]byte, error)
}