2323from serverlessworkflow .sdk .transition_data_condition import TransitionDataCondition
2424from serverlessworkflow .sdk .end_data_condition import EndDataCondition
2525
26- from transitions .extensions import HierarchicalMachine , GraphMachine
2726from transitions .extensions .nesting import NestedState
2827import warnings
2928
@@ -260,7 +259,67 @@ def sleep_state_details(self):
260259
261260 def event_state_details (self ):
262261 if isinstance (self .current_state , EventState ):
263- 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+ )
264323
265324 def foreach_state_details (self ):
266325 if isinstance (self .current_state , ForEachState ):
@@ -353,6 +412,7 @@ def generate_actions_info(
353412 state_name : str ,
354413 actions : List [Dict [str , Action ]],
355414 action_mode : str = "sequential" ,
415+ initial_states : List [str ] = [],
356416 ):
357417 if self .get_actions :
358418 parallel_states = []
@@ -387,7 +447,11 @@ def generate_actions_info(
387447 ns := self .state_machine .state_cls (name )
388448 )
389449 ns .tags = ["event" ]
390- self .get_action_event (state = ns , e_name = name )
450+ self .get_action_event (
451+ state = ns ,
452+ e_name = action .eventRef .triggerEventRef ,
453+ er_name = action .eventRef .resultEventRef ,
454+ )
391455 if name :
392456 if action_mode == "sequential" :
393457 if i < len (actions ) - 1 :
@@ -439,19 +503,36 @@ def generate_actions_info(
439503 )
440504 ns .tags = ["event" ]
441505 self .get_action_event (
442- state = ns , e_name = next_name
506+ state = ns ,
507+ e_name = action .eventRef .triggerEventRef ,
508+ er_name = action .eventRef .resultEventRef ,
443509 )
444510 self .state_machine .add_transition (
445511 trigger = "" ,
446512 source = f"{ state_name } .{ name } " ,
447513 dest = f"{ state_name } .{ next_name } " ,
448514 )
449- if i == 0 :
515+ if i == 0 and not initial_states :
450516 machine_state .initial = name
517+ elif i == 0 and initial_states :
518+ for init_s in initial_states :
519+ self .state_machine .add_transition (
520+ trigger = "" ,
521+ source = f"{ state_name } .{ init_s } " ,
522+ dest = f"{ state_name } .{ name } " ,
523+ )
451524 elif action_mode == "parallel" :
452525 parallel_states .append (name )
453- if action_mode == "parallel" :
526+ if action_mode == "parallel" and not initial_states :
454527 machine_state .initial = parallel_states
528+ elif action_mode == "parallel" and initial_states :
529+ for init_s in initial_states :
530+ for ps in parallel_states :
531+ self .state_machine .add_transition (
532+ trigger = "" ,
533+ source = f"{ state_name } .{ init_s } " ,
534+ dest = f"{ state_name } .{ ps } " ,
535+ )
455536
456537 def get_action_function (self , state : NestedState , f_name : str ):
457538 if self .workflow .functions :
@@ -461,13 +542,14 @@ def get_action_function(self, state: NestedState, f_name: str):
461542 state .metadata = {"function" : current_function }
462543 break
463544
464- def get_action_event (self , state : NestedState , e_name : str ):
545+ def get_action_event (self , state : NestedState , e_name : str , er_name : str = "" ):
465546 if self .workflow .events :
466547 for event in self .workflow .events :
467548 current_event = event .serialize ().__dict__
468549 if current_event ["name" ] == e_name :
469550 state .metadata = {"event" : current_event }
470- break
551+ if current_event ["name" ] == er_name :
552+ state .metadata = {"result_event" : current_event }
471553
472554 def subflow_state_name (self , action : Action , subflow : Workflow ):
473555 return (
0 commit comments