...
The parameters are a possibly empty, comma-separated list of variable names. Optional All parameters can be assigned a default value. More details can be found in Using Optional and Named Parameters.
Zero or more declarations can be included to prepare data for the action block.
The action block is the same as the action block in a rule. Any action, including a user-defined action, can be used in the action block. Actions can be simple or compound. A simple action is a valid action block. For example, the following defines an action called send_warning
using the notify
action event:send
action:
Code Block | ||||
---|---|---|---|---|
| ||||
send_warning = defaction(msg, eci) { notify("event:send({"eci":eci, "domain":"message", "type":"warning", "attrs": {"warning":"Warning!", + msg}}); } |
Compound actions work the same as a rule. Suppose, for example, that in addition to putting up a notification, you wished to use send_directive:
Code Block | ||||
---|---|---|---|---|
| ||||
send_warning = defaction(msg, eci) { every { notifyevent:send({"eci":eci, "domain":"message", "type":"warning", "attrs": {"warning":"Warning!", + msg}}); send_directive("a_warning_was_given") with message = msg, {"message":"msg"}) } } |
You can use optional parameters to modify send_warning
so that it is sticky by default. (The default behavior for notify
is for the notification to fade after six seconds. When the sticky
parameter is true, notifications are permanent until the user closes them.)The variable send_warning
only has meaning in an action context within a rule. Because user-defined actions are first-class values (i.e., they can be returned as the result of executing an expression), they can be passed into functions or other user-defined actions and returned as the result from a function. You can thus write recursive actions.
User defined actions may also return values. The returned value may be a string, map, array etc. Consider the following example that returns a map:
Code Block | ||||
---|---|---|---|---|
| ||||
send_warning deleteChild = defaction(msg, transitorypico_name){ ent_children = false) { notify("Warning!", msg) with sticky = not transitory } |
The variable send_warning
only has meaning in an action context within a rule. The following shows the use of send_warning
and its optional parameter in the action of a rule:
Code Block | ||||
---|---|---|---|---|
| ||||
if error_level > 12 && error_level < 15 then
send_warning("Abnormal error levels")
with transitory = true |
...
children(){"children"}
child_collection = ent_children.collect(function(child){
(child{"name"} == pico_name) => "to_delete" | "dont_delete"
})
child_to_delete = child_collection{"to_delete"}.head()
every {
engine:removePico(child_to_delete{"id"})
}
return
{
"updated_children": child_collection{"dont_delete"},
"child": child_to_delete
}
} |
To retrieve the returned value (in this case a map), bind it to a new name using "setting":
Code Block |
---|
deleteChild(<give pico name>) setting(returnValue) |