Packages
reactor
0.15.0
1.0.2
1.0.1
1.0.0
0.17.0
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
An asynchronous, graph-based execution engine
Current section
Files
Jump to
Current section
Files
lib/reactor/step/anon_fn.ex
defmodule Reactor.Step.AnonFn do
@moduledoc """
The built-in step for executing in-line DSL anonymous functions.
## Options
* `run` - a one or two arity function or MFA which will be called as the run
function of the step.
* `compensate` - a one to three arity function or MFA which will be called as
the compensate function of the step. Optional.
* `undo` - a one to three arity function or MFA which will be called as the
undo function of this step. Optional.
"""
use Reactor.Step
@behaviour Reactor.Mermaid
@doc false
@impl true
@spec run(Reactor.inputs(), Reactor.context(), keyword) :: {:ok | :error, any}
def run(arguments, context, options) do
case Keyword.fetch!(options, :run) do
fun when is_function(fun, 1) ->
fun.(arguments)
fun when is_function(fun, 2) ->
fun.(arguments, context)
{m, f, a} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [arguments, context] ++ a)
end
rescue
error -> {:error, error}
end
@doc false
@impl true
@spec compensate(any, Reactor.inputs(), Reactor.context(), keyword) ::
{:continue, any} | :ok | :retry
def compensate(reason, arguments, context, options) do
case Keyword.fetch(options, :compensate) do
{:ok, fun} when is_function(fun, 1) ->
fun.(reason)
{:ok, fun} when is_function(fun, 2) ->
fun.(reason, arguments)
{:ok, fun} when is_function(fun, 3) ->
fun.(reason, arguments, context)
{:ok, {m, f, a}} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [reason, arguments, context] ++ a)
_ ->
:ok
end
end
@doc false
@impl true
@spec undo(any, Reactor.inputs(), Reactor.context(), keyword) :: :ok | :retry | {:error, any}
def undo(value, arguments, context, options) do
case Keyword.fetch(options, :undo) do
{:ok, fun} when is_function(fun, 1) ->
fun.(value)
{:ok, fun} when is_function(fun, 2) ->
fun.(value, arguments)
{:ok, fun} when is_function(fun, 3) ->
fun.(value, arguments, context)
{:ok, {m, f, a}} when is_atom(m) and is_atom(f) and is_list(a) ->
apply(m, f, [value, arguments, context] ++ a)
_ ->
:ok
end
end
@doc false
@impl true
def can?(%{impl: {_, opts}}, :undo), do: is_function(Keyword.get(opts, :undo))
def can?(%{impl: {_, opts}}, :compensate), do: is_function(Keyword.get(opts, :compensate))
def can?(_, _), do: false
@doc false
@impl true
def to_mermaid(step, options),
do: __MODULE__.Mermaid.to_mermaid(step, options)
end