-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent_unserialize_registry.go
53 lines (44 loc) · 1.2 KB
/
event_unserialize_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
53
package eventcore
import (
"encoding/json"
"reflect"
"sync"
)
func makeJsonUnserializer(e Event) EventUnserializer {
_type := reflect.Indirect(reflect.ValueOf(e)).Type()
return func(data []byte) (Event, error) {
e := reflect.New(_type).Interface().(Event)
if err := json.Unmarshal(data, e); err != nil {
return nil, err
}
return e, nil
}
}
type eventUnserailizeRegistry struct {
sync.Map
}
var eventUnserailizers *eventUnserailizeRegistry
func (s *eventUnserailizeRegistry) getUnserializer(eventType EventType) EventUnserializer {
if v, ok := s.Load(eventType); ok {
if h, ok := v.(EventUnserializer); ok {
return h
}
}
return nil
}
func (s *eventUnserailizeRegistry) setUnserializer(eventType EventType, unserializer EventUnserializer) {
s.Store(eventType, unserializer)
}
func init() {
eventUnserailizers = &eventUnserailizeRegistry{}
}
// RegisterEvent assign event with a eventType
func RegisterEvent(e Event, unserializer ...EventUnserializer) EventType {
e.BindSelf(e)
if len(unserializer) > 0 {
eventUnserailizers.setUnserializer(e.GetType(), unserializer[0])
return e.GetType()
}
eventUnserailizers.setUnserializer(e.GetType(), makeJsonUnserializer(e))
return e.GetType()
}