forked from crypto-com/chain-indexing
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.go
52 lines (40 loc) · 1.38 KB
/
registry.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
package event
import (
"errors"
"fmt"
)
var ErrMismatchEvent = errors.New("mismatched event")
type Registry struct {
decoders map[string]Decoder
}
func NewRegistry() *Registry {
return &Registry{
decoders: make(map[string]Decoder),
}
}
// Register add a mapping of "event name ane version" to Decoder to the registry. It will overwrite
// existing registration if any.
func (registry *Registry) Register(eventName string, eventVersion int, decoder Decoder) {
registry.decoders[eventType(eventName, eventVersion)] = decoder
}
// IsRegister returns true when the event to decoder mapping is already registered
func (registry *Registry) IsRegistered(eventName string, eventVersion int) bool {
_, exist := registry.decoders[eventType(eventName, eventVersion)]
return exist
}
func (registry *Registry) DecodeByType(eventName string, eventVersion int, encoded []byte) (Event, error) {
var err error
if !registry.IsRegistered(eventName, eventVersion) {
return nil, fmt.Errorf("unrecognized event type `%s`", eventType(eventName, eventVersion))
}
decoder := registry.decoders[eventType(eventName, eventVersion)]
var event Event
if event, err = decoder(encoded); err != nil {
return nil, fmt.Errorf("error decoding event: %v", err)
}
return event, nil
}
func eventType(name string, version int) string {
return fmt.Sprintf("%sV%d", name, version)
}
type Decoder = func([]byte) (Event, error)