/
event.go
101 lines (82 loc) · 1.97 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
package event
import (
"encoding/json"
"github.com/rs/xid"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/anypb"
"github.com/ericyaoxr/mcube/types/ftime"
)
// 事件主题定义(由事件类型确定)
// 1. 操作事件
func NewJsonOperateEvent(e *OperateEventData) (*Event, error) {
return NewOperateEvent(ContentType_JSON, e)
}
func NewProtoOperateEvent(e *OperateEventData) (*Event, error) {
return NewOperateEvent(ContentType_PROTOBUF, e)
}
// NewOperateEvent 实例
func NewOperateEvent(t ContentType, e *OperateEventData) (*Event, error) {
var err error
obj := &Event{
Id: xid.New().String(),
Type: Type_OPERATE,
Header: NewHeader(),
Body: new(anypb.Any),
}
obj.Header.ContentType = t
switch t {
case ContentType_JSON:
obj.Body.Value, err = json.Marshal(e)
default:
obj.Body, err = anypb.New(e)
}
if err != nil {
return nil, err
}
return obj, nil
}
// NewDefaultEvent todo
func NewDefaultEvent() *Event {
return &Event{
Header: NewHeader(),
}
}
// NewHeader todo
func NewHeader() *Header {
return &Header{
Time: ftime.Now().Timestamp(),
Meta: make(map[string]string),
ContentType: ContentType_PROTOBUF,
}
}
// DecodeBody 解码body数据
func (e *Event) ParseBoby(body proto.Message) (err error) {
switch e.Header.ContentType {
case ContentType_JSON:
err = json.Unmarshal(e.Body.Value, body)
default:
err = anypb.UnmarshalTo(e.Body, body, proto.UnmarshalOptions{})
}
return err
}
// Validate 校验事件是否合法
func (e *Event) Validate() error {
return nil
}
// GetMetaKey 获取meta信息
func (e *Event) GetMetaKey(key string) (string, bool) {
v, ok := e.Header.Meta[key]
return v, ok
}
// SetMeta 设置meta信息
func (e *Event) SetMeta(key, value string) {
e.Header.Meta[key] = value
}
// SetLevel 设置事件级别
func (e *Event) SetLevel(l Level) {
e.Header.Level = l
}
// SetSource 设置事件来源
func (e *Event) SetSource(src string) {
e.Header.Source = src
}