-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent.go
55 lines (43 loc) · 1.33 KB
/
event.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
package fsm
import "fmt"
type Event struct {
beforeFn func(stateType, ...any) bool
beforeFnRegistered bool
tns map[stateType]stateType
afterFn func(stateType, ...any)
afterFnRegistered bool
fsm *FSM
}
func (e *Event) fire(eventArgs ...any) (stateType, error) {
if e.beforeFnRegistered && !e.beforeFn(e.fsm.state, eventArgs...) {
return e.fsm.state, fmt.Errorf("before function prevented transition")
}
if _, transitionPresent := e.tns[e.fsm.state]; !transitionPresent {
return e.fsm.state, fmt.Errorf("fired event does not trigger a transition")
}
if e.fsm.state == e.tns[e.fsm.state] {
return e.fsm.state, fmt.Errorf("the transition didnt change the state")
}
e.fsm.state = e.tns[e.fsm.state]
if e.afterFnRegistered {
e.afterFn(e.fsm.state, eventArgs...)
}
return e.fsm.state, nil
}
func (e *Event) BeforeTn(beforeFn func(state stateType, eventArgs ...any) bool) {
e.beforeFn = beforeFn
e.beforeFnRegistered = true
}
func (e *Event) AfterTn(afterFn func(state stateType, eventArgs ...any)) {
e.afterFn = afterFn
e.afterFnRegistered = true
}
func (e *Event) Tn(fromState stateType, toState stateType) {
e.tns[fromState] = toState
}
func newEvent(fsm *FSM) *Event {
return &Event{
fsm: fsm,
tns: map[stateType]stateType{},
}
}