-
Notifications
You must be signed in to change notification settings - Fork 581
/
operation.go
90 lines (74 loc) · 2.75 KB
/
operation.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
package simulation
// TODO: Figure out how to delete everything in this file OR migrate to improved logging concepts
import (
"encoding/json"
"github.com/cosmos/cosmos-sdk/types/simulation"
)
// entry kinds for use within OperationEntry
const (
BeginBlockEntryKind = "begin_block"
EndBlockEntryKind = "end_block"
MsgEntryKind = "msg"
QueuedMsgEntryKind = "queued_msg"
)
// OperationEntry - an operation entry for logging (ex. BeginBlock, EndBlock, XxxMsg, etc)
type OperationEntry struct {
EntryKind string `json:"entry_kind" yaml:"entry_kind"`
Height int64 `json:"height" yaml:"height"`
Order int64 `json:"order" yaml:"order"`
Operation json.RawMessage `json:"operation" yaml:"operation"`
}
// NewOperationEntry creates a new OperationEntry instance
func NewOperationEntry(entry string, height, order int64, op json.RawMessage) OperationEntry {
return OperationEntry{
EntryKind: entry,
Height: height,
Order: order,
Operation: op,
}
}
// BeginBlockEntry - operation entry for begin block
func BeginBlockEntry(height int64) OperationEntry {
return NewOperationEntry(BeginBlockEntryKind, height, -1, nil)
}
// EndBlockEntry - operation entry for end block
func EndBlockEntry(height int64) OperationEntry {
return NewOperationEntry(EndBlockEntryKind, height, -1, nil)
}
// MsgEntry - operation entry for standard msg
func MsgEntry(height, order int64, opMsg simulation.OperationMsg) OperationEntry {
return NewOperationEntry(MsgEntryKind, height, order, opMsg.MustMarshal())
}
// QueuedMsgEntry creates an operation entry for a given queued message.
func QueuedMsgEntry(height int64, opMsg simulation.OperationMsg) OperationEntry {
return NewOperationEntry(QueuedMsgEntryKind, height, -1, opMsg.MustMarshal())
}
// MustMarshal marshals the operation entry, panic on error.
func (oe OperationEntry) MustMarshal() json.RawMessage {
out, err := json.Marshal(oe)
if err != nil {
panic(err)
}
return out
}
// OperationQueue defines an object for a queue of operations
type OperationQueue map[int][]simulation.Operation
// NewOperationQueue creates a new OperationQueue instance.
func NewOperationQueue() OperationQueue {
return make(OperationQueue)
}
// queueOperations adds all future operations into the operation queue.
// TODO: Change FutureOperation to FutureAction
func (simState *simState) queueOperations(futureOps []simulation.FutureOperation) {
for _, futureOp := range futureOps {
futureOp := futureOp
if futureOp.BlockHeight != 0 {
if val, ok := simState.operationQueue[futureOp.BlockHeight]; ok {
simState.operationQueue[futureOp.BlockHeight] = append(val, futureOp.Op)
} else {
simState.operationQueue[futureOp.BlockHeight] = []simulation.Operation{futureOp.Op}
}
continue
}
}
}