/
state.go
58 lines (46 loc) · 1.29 KB
/
state.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
package vald
import (
"encoding/json"
"fmt"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
//go:generate moq -pkg mock -out ./mock/state.go . ReadWriter
// ReadWriter represents a data source/sink
type ReadWriter interface {
WriteAll([]byte) error
ReadAll() ([]byte, error)
}
// StateStore manages event state persistence
type StateStore struct {
rw ReadWriter
}
// NewStateStore returns a new StateStore instance
func NewStateStore(rw ReadWriter) StateStore {
return StateStore{rw: rw}
}
// GetState returns the stored block height for which all events have been published
func (s StateStore) GetState() (completed int64, err error) {
bz, err := s.rw.ReadAll()
if err != nil {
return 0, sdkerrors.Wrap(err, "could not read the event state")
}
err = json.Unmarshal(bz, &completed)
if err != nil {
return 0, sdkerrors.Wrap(err, "state is in unexpected format")
}
if completed < 0 {
return 0, fmt.Errorf("state must be a positive integer")
}
return completed, nil
}
// SetState persists the block height for which all events have been published
func (s StateStore) SetState(completed int64) error {
if completed < 0 {
return fmt.Errorf("state must be a positive integer")
}
bz, err := json.Marshal(completed)
if err != nil {
return err
}
return s.rw.WriteAll(bz)
}