Skip to content

Commit c335de3

Browse files
authored
Merge pull request #72 from makasim/split-state-commands
split flowstate.GetCommand into flowstate.GetStateByID and flowstate.GetStateByLabels.
2 parents a433b7e + 5b4c0c0 commit c335de3

33 files changed

+260
-232
lines changed

cmd_get.go

Lines changed: 0 additions & 43 deletions
This file was deleted.

cmd_get_many.go

Lines changed: 0 additions & 76 deletions
This file was deleted.

cmd_get_state.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package flowstate
2+
3+
import "fmt"
4+
5+
func GetStateByID(stateCtx *StateCtx, id StateID, rev int64) *GetStateByIDCommand {
6+
return &GetStateByIDCommand{
7+
ID: id,
8+
Rev: rev,
9+
StateCtx: stateCtx,
10+
}
11+
}
12+
13+
type GetStateByIDCommand struct {
14+
command
15+
16+
ID StateID
17+
Rev int64
18+
19+
StateCtx *StateCtx
20+
}
21+
22+
func (cmd *GetStateByIDCommand) Prepare() error {
23+
if cmd.ID == "" {
24+
return fmt.Errorf(`id is empty`)
25+
}
26+
if cmd.Rev < 0 {
27+
return fmt.Errorf(`rev must be >= 0`)
28+
}
29+
return nil
30+
}
31+
32+
func (cmd *GetStateByIDCommand) Result() (*StateCtx, error) {
33+
if cmd.StateCtx == nil {
34+
return nil, fmt.Errorf(`cmd.StateCtx`)
35+
}
36+
37+
return cmd.StateCtx, nil
38+
}
39+
40+
func GetStateByLabels(stateCtx *StateCtx, labels map[string]string) *GetStateByLabelsCommand {
41+
return &GetStateByLabelsCommand{
42+
Labels: labels,
43+
StateCtx: stateCtx,
44+
}
45+
}
46+
47+
type GetStateByLabelsCommand struct {
48+
command
49+
50+
Labels map[string]string
51+
52+
StateCtx *StateCtx
53+
}
54+
55+
func (cmd *GetStateByLabelsCommand) Result() (*StateCtx, error) {
56+
if cmd.StateCtx == nil {
57+
return nil, fmt.Errorf(`cmd.StateCtx is nil`)
58+
}
59+
60+
return cmd.StateCtx, nil
61+
}

cmd_get_states.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package flowstate
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
const GetManyDefaultLimit = 50
9+
10+
type GetStatesResult struct {
11+
States []State
12+
More bool
13+
}
14+
15+
func GetStatesByLabels(labels map[string]string) *GetStatesCommand {
16+
return (&GetStatesCommand{}).WithORLabels(labels)
17+
}
18+
19+
type GetStatesCommand struct {
20+
command
21+
22+
SinceRev int64
23+
SinceTime time.Time
24+
Labels []map[string]string
25+
LatestOnly bool
26+
Limit int
27+
28+
result *GetStatesResult
29+
}
30+
31+
func (cmd *GetStatesCommand) Result() (*GetStatesResult, error) {
32+
if cmd.result == nil {
33+
return nil, fmt.Errorf("no result set")
34+
}
35+
36+
return cmd.result, nil
37+
}
38+
39+
func (cmd *GetStatesCommand) SetResult(result *GetStatesResult) {
40+
cmd.result = result
41+
}
42+
43+
func (cmd *GetStatesCommand) WithSinceRev(rev int64) *GetStatesCommand {
44+
cmd.SinceRev = rev
45+
return cmd
46+
}
47+
48+
func (cmd *GetStatesCommand) WithLatestOnly() *GetStatesCommand {
49+
cmd.LatestOnly = true
50+
return cmd
51+
}
52+
53+
func (cmd *GetStatesCommand) WithSinceLatest() *GetStatesCommand {
54+
cmd.SinceRev = -1
55+
return cmd
56+
}
57+
58+
func (cmd *GetStatesCommand) WithSinceTime(since time.Time) *GetStatesCommand {
59+
cmd.SinceTime = since
60+
return cmd
61+
}
62+
63+
func (cmd *GetStatesCommand) WithORLabels(labels map[string]string) *GetStatesCommand {
64+
if len(labels) == 0 {
65+
return cmd
66+
}
67+
68+
cmd.Labels = append(cmd.Labels, labels)
69+
return cmd
70+
}
71+
72+
func (cmd *GetStatesCommand) Prepare() {
73+
if cmd.Limit == 0 {
74+
cmd.Limit = GetManyDefaultLimit
75+
}
76+
}

log.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func logDo(execSessID int64, cmd0 Command, l *slog.Logger) {
125125
args = append(args, "cmd", "serialize")
126126
case *GetFlowCommand:
127127
args = append(args, "cmd", "get_flow", "flow_id", cmd.StateCtx.Current.Transition.ToID)
128-
case *GetManyCommand:
128+
case *GetStatesCommand:
129129
args = append(args, "cmd", "watch")
130130
if cmd.SinceRev > 0 {
131131
args = append(args, "since_rev", cmd.SinceRev)

memdriver/getter.go

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,42 +21,51 @@ func NewGetter(l *Log) *Getter {
2121

2222
func (d *Getter) Do(cmd0 flowstate.Command) error {
2323
switch cmd := cmd0.(type) {
24-
case *flowstate.GetCommand:
25-
return d.doGet(cmd)
26-
case *flowstate.GetManyCommand:
24+
case *flowstate.GetStateByIDCommand:
25+
return d.doGetStateByID(cmd)
26+
case *flowstate.GetStateByLabelsCommand:
27+
return d.doGetStateByLabels(cmd)
28+
case *flowstate.GetStatesCommand:
2729
return d.doGetMany(cmd)
2830
default:
2931
return flowstate.ErrCommandNotSupported
3032
}
3133
}
3234

33-
func (d *Getter) doGet(cmd *flowstate.GetCommand) error {
34-
if len(cmd.Labels) > 0 {
35-
stateCtx, _ := d.l.GetLatestByLabels([]map[string]string{cmd.Labels})
36-
if stateCtx == nil {
37-
return fmt.Errorf("%w; labels=%v", flowstate.ErrNotFound, cmd.Labels)
38-
}
39-
stateCtx.CopyTo(cmd.StateCtx)
40-
} else if cmd.ID != "" && cmd.Rev == 0 {
35+
func (d *Getter) doGetStateByID(cmd *flowstate.GetStateByIDCommand) error {
36+
if err := cmd.Prepare(); err != nil {
37+
return fmt.Errorf("get state by id: %w", err)
38+
}
39+
40+
if cmd.Rev == 0 {
4141
stateCtx, _ := d.l.GetLatestByID(cmd.ID)
4242
if stateCtx == nil {
4343
return fmt.Errorf("%w; id=%s", flowstate.ErrNotFound, cmd.ID)
4444
}
4545
stateCtx.CopyTo(cmd.StateCtx)
46-
} else if cmd.ID != "" && cmd.Rev > 0 {
47-
stateCtx := d.l.GetByIDAndRev(cmd.ID, cmd.Rev)
48-
if stateCtx == nil {
49-
return fmt.Errorf("%w; id=%s rev=%d", flowstate.ErrNotFound, cmd.ID, cmd.Rev)
50-
}
51-
stateCtx.CopyTo(cmd.StateCtx)
52-
} else {
53-
return fmt.Errorf("invalid get command")
46+
return nil
47+
}
48+
49+
stateCtx := d.l.GetByIDAndRev(cmd.ID, cmd.Rev)
50+
if stateCtx == nil {
51+
return fmt.Errorf("%w; id=%s rev=%d", flowstate.ErrNotFound, cmd.ID, cmd.Rev)
52+
}
53+
stateCtx.CopyTo(cmd.StateCtx)
54+
55+
return nil
56+
}
57+
58+
func (d *Getter) doGetStateByLabels(cmd *flowstate.GetStateByLabelsCommand) error {
59+
stateCtx, _ := d.l.GetLatestByLabels([]map[string]string{cmd.Labels})
60+
if stateCtx == nil {
61+
return fmt.Errorf("%w; labels=%v", flowstate.ErrNotFound, cmd.Labels)
5462
}
63+
stateCtx.CopyTo(cmd.StateCtx)
5564

5665
return nil
5766
}
5867

59-
func (d *Getter) doGetMany(cmd *flowstate.GetManyCommand) error {
68+
func (d *Getter) doGetMany(cmd *flowstate.GetStatesCommand) error {
6069
cmd.Prepare()
6170

6271
states := make([]flowstate.State, 0, cmd.Limit)
@@ -85,7 +94,7 @@ func (d *Getter) doGetMany(cmd *flowstate.GetManyCommand) error {
8594
d.l.Unlock()
8695

8796
if len(logStates) == 0 {
88-
cmd.SetResult(&flowstate.GetManyResult{
97+
cmd.SetResult(&flowstate.GetStatesResult{
8998
States: states,
9099
})
91100
return nil
@@ -106,14 +115,14 @@ func (d *Getter) doGetMany(cmd *flowstate.GetManyCommand) error {
106115
}
107116

108117
if len(states) >= cmd.Limit {
109-
cmd.SetResult(&flowstate.GetManyResult{
118+
cmd.SetResult(&flowstate.GetStatesResult{
110119
States: states[:cmd.Limit],
111120
More: len(states) > cmd.Limit,
112121
})
113122

114123
return nil
115124
} else if sinceRev >= untilRev {
116-
cmd.SetResult(&flowstate.GetManyResult{
125+
cmd.SetResult(&flowstate.GetStatesResult{
117126
States: states,
118127
More: false,
119128
})

0 commit comments

Comments
 (0)