Skip to content

Commit 46dd9b2

Browse files
authored
feat: pass context into fsm (#167)
* feat: pass context into fsm Signed-off-by: Guillaume Belanger <[email protected]> * chore: bump version Signed-off-by: Guillaume Belanger <[email protected]> * chore: move context to be first arg Signed-off-by: Guillaume Belanger <[email protected]> * chore: move context to be first arg Signed-off-by: Guillaume Belanger <[email protected]> * chore: instantiate only 1 context Signed-off-by: Guillaume Belanger <[email protected]> * chore: apply recommended quality improvements Signed-off-by: Guillaume Belanger <[email protected]> --------- Signed-off-by: Guillaume Belanger <[email protected]>
1 parent 12fe21c commit 46dd9b2

File tree

3 files changed

+21
-18
lines changed

3 files changed

+21
-18
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.3.3-dev
1+
1.4.0

fsm/fsm.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package fsm
66

77
import (
8+
"context"
89
"fmt"
910
"os"
1011
"strings"
@@ -14,11 +15,11 @@ import (
1415

1516
type (
1617
EventType string
17-
ArgsType map[string]interface{}
18+
ArgsType map[string]any
1819
)
1920

2021
type (
21-
Callback func(*State, EventType, ArgsType)
22+
Callback func(context.Context, *State, EventType, ArgsType)
2223
Callbacks map[StateType]Callback
2324
)
2425

@@ -89,7 +90,7 @@ func NewFSM(transitions Transitions, callbacks Callbacks) (*FSM, error) {
8990
// - on exit callback: call when fsm leave one state, with ExitEvent event
9091
// - event callback: call when user trigger a user-defined event
9192
// - on entry callback: call when fsm enter one state, with EntryEvent event
92-
func (fsm *FSM) SendEvent(state *State, event EventType, args ArgsType) error {
93+
func (fsm *FSM) SendEvent(ctx context.Context, state *State, event EventType, args ArgsType) error {
9394
key := eventKey{
9495
From: state.Current(),
9596
Event: event,
@@ -99,25 +100,25 @@ func (fsm *FSM) SendEvent(state *State, event EventType, args ArgsType) error {
99100
logger.FsmLog.Infof("handle event[%s], transition from [%s] to [%s]", event, trans.From, trans.To)
100101

101102
// event callback
102-
fsm.callbacks[trans.From](state, event, args)
103+
fsm.callbacks[trans.From](ctx, state, event, args)
103104

104105
// exit callback
105106
if trans.From != trans.To {
106-
fsm.callbacks[trans.From](state, ExitEvent, args)
107+
fsm.callbacks[trans.From](ctx, state, ExitEvent, args)
107108
}
108109

109110
// entry callback
110111
if trans.From != trans.To {
111112
state.Set(trans.To)
112-
fsm.callbacks[trans.To](state, EntryEvent, args)
113+
fsm.callbacks[trans.To](ctx, state, EntryEvent, args)
113114
}
114115
return nil
115116
} else {
116117
return fmt.Errorf("unknown transition[From: %s, Event: %s]", state.Current(), event)
117118
}
118119
}
119120

120-
// ExportDot export fsm in dot format to outfile, which can be visualize by graphviz
121+
// ExportDot export fsm in dot format to outfile, which can be visualized by graphviz
121122
func ExportDot(fsm *FSM, outfile string) error {
122123
dot := `digraph FSM {
123124
rankdir=LR

fsm/fsm_test.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package fsm
66

77
import (
8+
"context"
89
"fmt"
910
"testing"
1011

@@ -34,16 +35,17 @@ func TestState(t *testing.T) {
3435
}
3536

3637
func TestFSM(t *testing.T) {
38+
ctx := context.Background()
3739
f, err := NewFSM(Transitions{
3840
{Event: Open, From: Closed, To: Opened},
3941
{Event: Close, From: Opened, To: Closed},
4042
{Event: Open, From: Opened, To: Opened},
4143
{Event: Close, From: Closed, To: Closed},
4244
}, Callbacks{
43-
Opened: func(state *State, event EventType, args ArgsType) {
45+
Opened: func(ctx context.Context, state *State, event EventType, args ArgsType) {
4446
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
4547
},
46-
Closed: func(state *State, event EventType, args ArgsType) {
48+
Closed: func(ctx context.Context, state *State, event EventType, args ArgsType) {
4749
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
4850
},
4951
})
@@ -52,12 +54,12 @@ func TestFSM(t *testing.T) {
5254

5355
assert.Nil(t, err, "NewFSM() failed")
5456

55-
assert.Nil(t, f.SendEvent(s, Open, ArgsType{"TestArg": "test arg"}), "SendEvent() failed")
56-
assert.Nil(t, f.SendEvent(s, Close, ArgsType{"TestArg": "test arg"}), "SendEvent() failed")
57+
assert.Nil(t, f.SendEvent(ctx, s, Open, ArgsType{"TestArg": "test arg"}), "SendEvent() failed")
58+
assert.Nil(t, f.SendEvent(ctx, s, Close, ArgsType{"TestArg": "test arg"}), "SendEvent() failed")
5759
assert.True(t, s.Is(Closed), "Transition failed")
5860

5961
fakeEvent := EventType("fake event")
60-
assert.EqualError(t, f.SendEvent(s, fakeEvent, nil),
62+
assert.EqualError(t, f.SendEvent(ctx, s, fakeEvent, nil),
6163
fmt.Sprintf("unknown transition[From: %s, Event: %s]", s.Current(), fakeEvent))
6264
}
6365

@@ -72,10 +74,10 @@ func TestFSMInitFail(t *testing.T) {
7274
{Event: Open, From: Opened, To: Opened},
7375
{Event: Close, From: Closed, To: Closed},
7476
}, Callbacks{
75-
Opened: func(state *State, event EventType, args ArgsType) {
77+
Opened: func(ctx context.Context, state *State, event EventType, args ArgsType) {
7678
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
7779
},
78-
Closed: func(state *State, event EventType, args ArgsType) {
80+
Closed: func(ctx context.Context, state *State, event EventType, args ArgsType) {
7981
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
8082
},
8183
})
@@ -90,13 +92,13 @@ func TestFSMInitFail(t *testing.T) {
9092
{Event: Open, From: Opened, To: Opened},
9193
{Event: Close, From: Closed, To: Closed},
9294
}, Callbacks{
93-
Opened: func(state *State, event EventType, args ArgsType) {
95+
Opened: func(ctx context.Context, state *State, event EventType, args ArgsType) {
9496
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
9597
},
96-
Closed: func(state *State, event EventType, args ArgsType) {
98+
Closed: func(ctx context.Context, state *State, event EventType, args ArgsType) {
9799
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
98100
},
99-
fakeState: func(state *State, event EventType, args ArgsType) {
101+
fakeState: func(ctx context.Context, state *State, event EventType, args ArgsType) {
100102
fmt.Printf("event [%+v] at state [%+v]\n", event, state.Current())
101103
},
102104
})

0 commit comments

Comments
 (0)