@@ -259,7 +259,67 @@ def sleep_state_details(self):
259
259
260
260
def event_state_details (self ):
261
261
if isinstance (self .current_state , EventState ):
262
- self .state_to_machine_state (["event_state" , "state" ])
262
+ state = self .state_to_machine_state (["event_state" , "state" ])
263
+ if self .get_actions :
264
+ if on_events := self .current_state .onEvents :
265
+ state .initial = [] if len (on_events ) > 1 else on_events [0 ]
266
+ for i , oe in enumerate (on_events ):
267
+ state .add_substate (
268
+ oe_state := self .state_machine .state_cls (
269
+ oe_name := f"onEvent { i } "
270
+ )
271
+ )
272
+
273
+ # define initial state
274
+ if i == 0 and len (on_events ) > 1 :
275
+ state .initial = [oe_state .name ]
276
+ elif i == 0 and len (on_events ) == 1 :
277
+ state .initial = oe_state .name
278
+ else :
279
+ state .initial .append (oe_state .name )
280
+
281
+ event_names = []
282
+ for ie , event in enumerate (oe .eventRefs ):
283
+ oe_state .add_substate (
284
+ ns := self .state_machine .state_cls (event )
285
+ )
286
+ ns .tags = ["event" ]
287
+ self .get_action_event (state = ns , e_name = event )
288
+ event_names .append (event )
289
+
290
+ # define initial state
291
+ if ie == 0 and len (oe .eventRefs ) > 1 :
292
+ oe_state .initial = [event ]
293
+ elif ie == 0 and len (oe .eventRefs ) == 1 :
294
+ oe_state .initial = event
295
+ else :
296
+ oe_state .initial .append (event )
297
+
298
+ if self .current_state .exclusive :
299
+ oe_state .add_substate (
300
+ ns := self .state_machine .state_cls (
301
+ action_name := f"action { ie } "
302
+ )
303
+ )
304
+ self .state_machine .add_transition (
305
+ trigger = "" ,
306
+ source = f"{ self .current_state .name } .{ oe_name } .{ event } " ,
307
+ dest = f"{ self .current_state .name } .{ oe_name } .{ action_name } " ,
308
+ )
309
+ self .generate_actions_info (
310
+ machine_state = ns ,
311
+ state_name = f"{ self .current_state .name } .{ oe_name } .{ action_name } " ,
312
+ actions = oe .actions ,
313
+ action_mode = oe .actionMode ,
314
+ )
315
+ if not self .current_state .exclusive and oe .actions :
316
+ self .generate_actions_info (
317
+ machine_state = oe_state ,
318
+ state_name = f"{ self .current_state .name } .{ oe_name } " ,
319
+ actions = oe .actions ,
320
+ action_mode = oe .actionMode ,
321
+ initial_states = event_names ,
322
+ )
263
323
264
324
def foreach_state_details (self ):
265
325
if isinstance (self .current_state , ForEachState ):
@@ -352,6 +412,7 @@ def generate_actions_info(
352
412
state_name : str ,
353
413
actions : List [Dict [str , Action ]],
354
414
action_mode : str = "sequential" ,
415
+ initial_states : List [str ] = [],
355
416
):
356
417
if self .get_actions :
357
418
parallel_states = []
@@ -445,12 +506,27 @@ def generate_actions_info(
445
506
source = f"{ state_name } .{ name } " ,
446
507
dest = f"{ state_name } .{ next_name } " ,
447
508
)
448
- if i == 0 :
509
+ if i == 0 and not initial_states :
449
510
machine_state .initial = name
511
+ elif i == 0 and initial_states :
512
+ for init_s in initial_states :
513
+ self .state_machine .add_transition (
514
+ trigger = "" ,
515
+ source = f"{ state_name } .{ init_s } " ,
516
+ dest = f"{ state_name } .{ name } " ,
517
+ )
450
518
elif action_mode == "parallel" :
451
519
parallel_states .append (name )
452
- if action_mode == "parallel" :
520
+ if action_mode == "parallel" and not initial_states :
453
521
machine_state .initial = parallel_states
522
+ elif action_mode == "parallel" and initial_states :
523
+ for init_s in initial_states :
524
+ for ps in parallel_states :
525
+ self .state_machine .add_transition (
526
+ trigger = "" ,
527
+ source = f"{ state_name } .{ init_s } " ,
528
+ dest = f"{ state_name } .{ ps } " ,
529
+ )
454
530
455
531
def get_action_function (self , state : NestedState , f_name : str ):
456
532
if self .workflow .functions :
0 commit comments