-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
141 lines (111 loc) · 2.36 KB
/
types.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
132
133
134
135
136
137
138
139
140
141
package corroclient
import (
"errors"
)
type Statement struct {
Query string `json:"query"`
Params []any `json:"params,omitempty"`
NamedParams map[string]any `json:"named_params,omitempty"`
}
type EventType string
const (
EventTypeRow EventType = "row"
EventTypeEOQ EventType = "eoq"
EventTypeChange EventType = "change"
EventTypeColumns EventType = "columns"
EventTypeError EventType = "error"
)
type Event interface {
Type() EventType
}
type ChangeType string
const (
ChangeTypeInsert ChangeType = "insert"
ChangeTypeUpdate ChangeType = "update"
ChangeTypeDelete ChangeType = "delete"
)
type Change struct {
ChangeId int64 `json:"change_id"`
ChangeType ChangeType `json:"change_type"`
Row *Row `json:"row"`
}
func (c *Change) Type() EventType {
return EventTypeChange
}
type Row struct {
rowId int64
values []any
columns []string
}
func (r *Row) RowId() int64 {
return r.rowId
}
func (r *Row) Type() EventType {
return EventTypeRow
}
type EOQ struct {
ChangeId int64 `json:"change_id"`
Time float64 `json:"time"`
}
func (e *EOQ) Type() EventType {
return EventTypeEOQ
}
type Columns []string
func (c Columns) Type() EventType {
return EventTypeColumns
}
type Error struct {
Message string `json:"message"`
}
func (e *Error) Type() EventType {
return EventTypeError
}
var ErrInvalidRow = errors.New("corrosubs: Invalid row")
func readRow(data []any) (*Row, error) {
if len(data) != 2 {
return nil, ErrInvalidRow
}
rowIdFloat, ok := data[0].(float64)
if !ok {
return nil, ErrInvalidRow
}
rowId := int64(rowIdFloat)
values, ok := data[1].([]any)
if !ok {
return nil, ErrInvalidRow
}
return &Row{
rowId: rowId,
values: values,
}, nil
}
var ErrInvalidChange = errors.New("corrosubs: Invalid change")
func readChange(data []any) (*Change, error) {
if len(data) != 4 {
return nil, ErrInvalidRow
}
changeType, ok := data[0].(string)
if !ok {
return nil, ErrInvalidChange
}
rowId, ok := data[1].(float64)
if !ok {
return nil, ErrInvalidChange
}
values, ok := data[2].([]any)
if !ok {
return nil, ErrInvalidChange
}
changeId, ok := data[3].(float64)
if !ok {
return nil, ErrInvalidChange
}
return &Change{
ChangeId: int64(changeId),
ChangeType: ChangeType(changeType),
Row: &Row{
rowId: int64(rowId),
values: values,
},
}, nil
}