Current section
Files
Jump to
Current section
Files
lib/core/in.ex
defmodule Virta.Core.In do
@moduledoc """
Serves as an entry point for a workflow.
`Virta.Core.In` is used internally for workflow port discovery, which enables invoking a workflow
from another workflow.
All workflows must use this component.
"""
@inports []
@outports []
use Virta.Component
@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
Enum.map(outport_args, fn(arg) ->
%{ to: port, pid: pid } = arg
send(pid, { request_id, port , Map.get(inport_args, port) })
end)
{ request_id, :noreply }
end
end