/
bonusChequeTracker.go
92 lines (74 loc) · 1.86 KB
/
bonusChequeTracker.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
package chequebook
import (
"errors"
"fmt"
"github.com/newswarm-lab/new-bee/pkg/storage"
)
const (
bonusChequeTrackerKey = "swap_bonus_cheque_tracker"
)
var (
ErrNoCashableCheque = errors.New("no cheque can be cashed out")
)
type bonusChequeTracker struct {
*tracker
storer storage.StateStorer
}
type tracker struct {
TotalCheques int
CashedIndex int
ChequeKeys []chequeKeyT
}
func loadBonusChequeTracker(storer storage.StateStorer) *bonusChequeTracker {
var tracker_ tracker
err := storer.Get(bonusChequeTrackerKey, &tracker_)
if err != nil {
if err == storage.ErrNotFound {
btracker_ := bonusChequeTracker{
tracker: &tracker{
TotalCheques: 0,
CashedIndex: -1,
ChequeKeys: make([]chequeKeyT, 0, 1024),
},
storer: storer,
}
return &btracker_
}
panic(fmt.Errorf("failed to load bonusChequeTracker from storage. Err: %w\n", err))
}
return &bonusChequeTracker{
tracker: &tracker_,
storer: storer,
}
}
func (b *bonusChequeTracker) receiveOneCheque(chequeK chequeKeyT) *bonusChequeTracker {
b.ChequeKeys = append(b.ChequeKeys, chequeK)
b.TotalCheques++
return b
}
func (b *bonusChequeTracker) chequeToCashout() (chequeKeyT, error) {
if b.TotalCheques < 1 || b.CashedIndex == b.TotalCheques-1 {
return "", ErrNoCashableCheque
}
chequeK := b.ChequeKeys[b.CashedIndex+1]
return chequeK, nil
}
func (b *bonusChequeTracker) confirmChequeToCashout() *bonusChequeTracker {
b.CashedIndex++
return b
}
func (b *bonusChequeTracker) store() error {
if err := b.storer.Put(bonusChequeTrackerKey, b); err != nil {
return err
}
return nil
}
func (b *bonusChequeTracker) uncashedChequeKey() []chequeKeyT {
if !b.uncashedChequeExists() {
return nil
}
return b.ChequeKeys[b.CashedIndex+1:]
}
func (b *bonusChequeTracker) uncashedChequeExists() bool {
return b.TotalCheques > 0 && b.CashedIndex < b.TotalCheques-1
}