@@ -259,7 +259,67 @@ def sleep_state_details(self):
259259
260260 def event_state_details (self ):
261261 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+ )
263323
264324 def foreach_state_details (self ):
265325 if isinstance (self .current_state , ForEachState ):
@@ -352,6 +412,7 @@ def generate_actions_info(
352412 state_name : str ,
353413 actions : List [Dict [str , Action ]],
354414 action_mode : str = "sequential" ,
415+ initial_states : List [str ] = [],
355416 ):
356417 if self .get_actions :
357418 parallel_states = []
@@ -445,12 +506,27 @@ def generate_actions_info(
445506 source = f"{ state_name } .{ name } " ,
446507 dest = f"{ state_name } .{ next_name } " ,
447508 )
448- if i == 0 :
509+ if i == 0 and not initial_states :
449510 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+ )
450518 elif action_mode == "parallel" :
451519 parallel_states .append (name )
452- if action_mode == "parallel" :
520+ if action_mode == "parallel" and not initial_states :
453521 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+ )
454530
455531 def get_action_function (self , state : NestedState , f_name : str ):
456532 if self .workflow .functions :
0 commit comments