-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfsm_manager.go
More file actions
125 lines (110 loc) · 2.37 KB
/
Copy pathfsm_manager.go
File metadata and controls
125 lines (110 loc) · 2.37 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package msm
import (
"reflect"
"go.uber.org/zap"
"gorm.io/gorm"
)
type FSMManager struct {
FSMs map[string]*FSM
Callbacks []ICallback
Plugins map[string]IPlugin
DB *gorm.DB
logger *zap.Logger
respChCap int
}
type FSMManagerSettings func(mgr *FSMManager)
func NewFSMManager(db *gorm.DB, logger *zap.Logger, settings ...FSMManagerSettings) *FSMManager {
mgr := &FSMManager{
FSMs: make(map[string]*FSM),
Callbacks: make([]ICallback, 0),
Plugins: make(map[string]IPlugin),
DB: db,
logger: logger,
respChCap: 32,
}
for _, setting := range settings {
setting(mgr)
}
return mgr
}
func (m *FSMManager) Start() {
for _, fsm := range m.FSMs {
fsm.Start()
}
}
func (m *FSMManager) Stop() {
for _, fsm := range m.FSMs {
fsm.Stop()
}
}
func (m *FSMManager) Sync() {
for _, fsm := range m.FSMs {
fsm.Sync()
}
}
func (m *FSMManager) NewFSM(name string, storageFactory StorageFactory) *FSM {
storageType := reflect.TypeOf(storageFactory).Out(0)
fsm := &FSM{
Manager: m,
Name: name,
Table: nil,
Terminals: map[State]bool{FinishState: true},
cancel: make(chan struct{}),
response: make(chan Response, m.respChCap),
onTerminated: make(map[FsmID][]TerminationCB),
storageFactory: storageFactory,
storageType: storageType,
logger: m.logger.Named(name),
DB: m.DB,
}
m.FSMs[name] = fsm
return fsm
}
func (m *FSMManager) CreateFSMInstance(fsmName string) FsmID {
fsm, ok := m.FSMs[fsmName]
if !ok {
return FsmID{}
}
return fsm.CreateFSM()
}
func (m *FSMManager) Process(id FsmID, src string, event Event) {
fsm, ok := m.FSMs[id.Fsm]
if !ok {
return
}
fsm.Process(id, src, event)
}
func (m *FSMManager) IsTerminated(id FsmID) bool {
fsm, ok := m.FSMs[id.Fsm]
if !ok {
return false
}
return fsm.IsTerminated(id)
}
func (m *FSMManager) AddPlugin(plugin IPlugin) {
m.Plugins[plugin.Name()] = plugin
}
func (m *FSMManager) AddCallback(cb ICallback) {
m.Callbacks = append(m.Callbacks, cb)
}
func (m *FSMManager) AutoMigrate() error {
for _, fsm := range m.FSMs {
err := fsm.AutoMigrate()
if err != nil {
return err
}
}
for _, plugin := range m.Plugins {
err := plugin.AutoMigrate()
if err != nil {
return err
}
}
for _, cb := range m.Callbacks {
err := cb.AutoMigrate()
if err != nil {
return err
}
}
return nil
}