/
dividend.go
96 lines (75 loc) · 1.87 KB
/
dividend.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
package quotes
import (
"fmt"
"io"
"github.com/nzai/bio"
"go.uber.org/zap"
)
// Dividend define stock dividend
type Dividend struct {
Enable bool
Timestamp uint64
Amount float32
}
// Encode encode dividend to io.Writer
func (d Dividend) Encode(w io.Writer) error {
bw := bio.NewBinaryWriter(w)
_, err := bw.Bool(d.Enable)
if err != nil {
zap.L().Error("encode dividend enable failed", zap.Error(err), zap.Bool("enable", d.Enable))
return err
}
if !d.Enable {
return nil
}
_, err = bw.UInt64(d.Timestamp)
if err != nil {
zap.L().Error("encode dividend timestamp failed", zap.Error(err), zap.Uint64("timestamp", d.Timestamp))
return err
}
_, err = bw.Float32(d.Amount)
if err != nil {
zap.L().Error("encode dividend amount failed", zap.Error(err), zap.Float32("amount", d.Amount))
return err
}
return nil
}
// Decode decode dividend from io.Reader
func (d *Dividend) Decode(r io.Reader) error {
br := bio.NewBinaryReader(r)
enable, err := br.Bool()
if err != nil {
zap.L().Error("decode dividend enable failed", zap.Error(err))
return err
}
if !enable {
return nil
}
timestamp, err := br.UInt64()
if err != nil {
zap.L().Error("decode dividend timestamp failed", zap.Error(err))
return err
}
amount, err := br.Float32()
if err != nil {
zap.L().Error("decode dividend amount failed", zap.Error(err))
return err
}
d.Enable = enable
d.Timestamp = timestamp
d.Amount = amount
return nil
}
// Equal check dividend is equal
func (d Dividend) Equal(s Dividend) error {
if d.Enable != s.Enable {
return fmt.Errorf("dividend enable %v is different from %v", d.Enable, s.Enable)
}
if d.Timestamp != s.Timestamp {
return fmt.Errorf("dividend timestamp %d is different from %d", d.Timestamp, s.Timestamp)
}
if d.Amount != s.Amount {
return fmt.Errorf("dividend amount %f is different from %f", d.Amount, s.Amount)
}
return nil
}