@@ -123,16 +123,35 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
123
123
return fmt .Sprint (ti ) < fmt .Sprint (tj )
124
124
})
125
125
126
+ type line struct {
127
+ source State
128
+ destination State
129
+ }
130
+
131
+ lines := make (map [line ][]string , len (triggerList ))
132
+ order := make ([]line , 0 , len (triggerList ))
126
133
for _ , trigger := range triggerList {
127
134
switch t := trigger .(type ) {
128
135
case * ignoredTriggerBehaviour :
129
- sb .WriteString (g .formatOneTransition (sm , sr .State , sr .State , t .Trigger , nil , t .Guard ))
136
+ ln := line {sr .State , sr .State }
137
+ if _ , ok := lines [ln ]; ! ok {
138
+ order = append (order , ln )
139
+ }
140
+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , nil , t .Guard ))
130
141
case * reentryTriggerBehaviour :
131
142
actions := g .getEntryActions (sr .EntryActions , t .Trigger )
132
- sb .WriteString (g .formatOneTransition (sm , sr .State , t .Destination , t .Trigger , actions , t .Guard ))
143
+ ln := line {sr .State , t .Destination }
144
+ if _ , ok := lines [ln ]; ! ok {
145
+ order = append (order , ln )
146
+ }
147
+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
133
148
case * internalTriggerBehaviour :
134
149
actions := g .getEntryActions (sr .EntryActions , t .Trigger )
135
- sb .WriteString (g .formatOneTransition (sm , sr .State , sr .State , t .Trigger , actions , t .Guard ))
150
+ ln := line {sr .State , sr .State }
151
+ if _ , ok := lines [ln ]; ! ok {
152
+ order = append (order , ln )
153
+ }
154
+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
136
155
case * transitioningTriggerBehaviour :
137
156
src := sm .stateConfig [sr .State ]
138
157
if src == nil {
@@ -149,15 +168,25 @@ func (g *graph) formatAllStateTransitions(sm *StateMachine, sr *stateRepresentat
149
168
} else {
150
169
destState = dest .State
151
170
}
152
- sb .WriteString (g .formatOneTransition (sm , src .State , destState , t .Trigger , actions , t .Guard ))
171
+ ln := line {sr .State , destState }
172
+ if _ , ok := lines [ln ]; ! ok {
173
+ order = append (order , ln )
174
+ }
175
+ lines [ln ] = append (lines [ln ], g .formatOneTransition (t .Trigger , actions , t .Guard ))
153
176
case * dynamicTriggerBehaviour :
154
177
// TODO: not supported yet
155
178
}
156
179
}
180
+
181
+ for _ , ln := range order {
182
+ content := lines [ln ]
183
+ sb .WriteString (g .formatOneLine (str (ln .source , true ), str (ln .destination , true ), strings .Join (content , "\\ n" )))
184
+ }
185
+
157
186
return sb .String ()
158
187
}
159
188
160
- func (g * graph ) formatOneTransition (sm * StateMachine , source , destination State , trigger Trigger , actions []string , guards transitionGuard ) string {
189
+ func (g * graph ) formatOneTransition (trigger Trigger , actions []string , guards transitionGuard ) string {
161
190
var sb strings.Builder
162
191
sb .WriteString (str (trigger , false ))
163
192
if len (actions ) > 0 {
@@ -170,7 +199,7 @@ func (g *graph) formatOneTransition(sm *StateMachine, source, destination State,
170
199
}
171
200
sb .WriteString (fmt .Sprintf ("[%s]" , esc (info .Description .String (), false )))
172
201
}
173
- return g . formatOneLine ( str ( source , true ), str ( destination , true ), sb .String () )
202
+ return sb .String ()
174
203
}
175
204
176
205
func (g * graph ) formatOneLine (fromNodeName , toNodeName , label string ) string {
0 commit comments