Packages

Flow based programming for elixir

Current section

Files

Jump to
virta lib core out.ex
Raw

lib/core/out.ex

defmodule Virta.Core.Out do
@moduledoc """
Serves as the output collection point for a workflow.
Any workflow which needs to return a value (or values) needs to use `Virta.Core.Out` as the last
node in the graph. It acts as a collector and sends a message to the invoking process with the
output.
"""
@inports []
@outports []
use Virta.Component
@doc false
def final do true end
@impl true
def loop(inport_args, outport_args, instance_pid) do
receive do
{ request_id, port, value } ->
inport_args = Map.put(inport_args, port, value)
required_fields = Enum.map(outport_args, fn(arg) -> Map.get(arg, :to) end)
if(required_fields |> Enum.all?(&(Map.has_key?(inport_args, &1)))) do
run(request_id, inport_args, outport_args, instance_pid)
loop(%{}, outport_args, instance_pid)
else
loop(inport_args, outport_args, instance_pid)
end
end
end
@impl true
def run(request_id, inport_args, _outport_args, instance_pid) do
send(instance_pid, { request_id, :output, inport_args })
end
end