@@ -59,6 +59,8 @@ def parse_element(element):
5959 return parse_if (element )
6060 elif tag == "send" :
6161 return parse_send (element )
62+ elif tag == "cancel" :
63+ return parse_cancel (element )
6264 else :
6365 raise ValueError (f"Unknown tag: { tag } " )
6466
@@ -74,6 +76,26 @@ def raise_action(*args, **kwargs):
7476 return raise_action
7577
7678
79+ def parse_cancel (element ):
80+ """Parses the <cancel> element into a callable."""
81+ sendid = element .attrib .get ("sendid" )
82+ sendidexpr = element .attrib .get ("sendidexpr" )
83+
84+ def cancel (* args , ** kwargs ):
85+ if sendid and sendidexpr :
86+ raise ValueError ("<cancel> cannot have both a 'sendid' and 'sendidexpr' attribute" )
87+ elif sendid :
88+ send_id = sendid
89+ elif sendidexpr :
90+ send_id = _eval (sendidexpr , ** kwargs )
91+ else :
92+ raise ValueError ("<cancel> must have either a 'sendid' or 'sendidexpr' attribute" )
93+ machine = kwargs ["machine" ]
94+ machine .cancel_event (send_id )
95+
96+ return cancel
97+
98+
7799def parse_log (element ):
78100 """Parses the <log> element into a callable."""
79101 label = element .attrib ["label" ]
@@ -360,7 +382,7 @@ def parse_send(element): # noqa: C901
360382 raise ValueError ("<send> must have an 'event' or `eventexpr` attribute" )
361383
362384 target_expr = element .attrib .get ("target" )
363- type_expr = element .attrib .get ("type" )
385+ type_attr = element .attrib .get ("type" )
364386 id_attr = element .attrib .get ("id" )
365387 idlocation = element .attrib .get ("idlocation" )
366388 delay_attr = element .attrib .get ("delay" )
@@ -386,7 +408,10 @@ def send_action(*args, **kwargs):
386408 # Evaluate expressions
387409 event = event_attr or eval (event_expr , {}, context )
388410 _target = eval (target_expr , {}, context ) if target_expr else None
389- _event_type = eval (type_expr , {}, context ) if type_expr else None
411+ if type_attr and type_attr != "http://www.w3.org/TR/scxml/#SCXMLEventProcessor" :
412+ raise ValueError (
413+ "Only 'http://www.w3.org/TR/scxml/#SCXMLEventProcessor' event type is supported"
414+ )
390415
391416 if id_attr :
392417 send_id = id_attr
@@ -412,7 +437,12 @@ def send_action(*args, **kwargs):
412437 for name , expr in params .items ():
413438 params_values [name ] = eval (expr , {}, context )
414439
415- Event (id = event , name = event , delay = delay ).put (* content , machine = machine , ** params_values )
440+ Event (id = event , name = event , delay = delay ).put (
441+ * content ,
442+ machine = machine ,
443+ send_id = send_id ,
444+ ** params_values ,
445+ )
416446
417447 return send_action
418448
0 commit comments