Packages
reactor
0.17.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/mermaid/reactor.ex
defmodule Reactor.Mermaid.Reactor do
@moduledoc false
alias Reactor.Mermaid.{Node, Step}
import Reactor.Utils
import Reactor.Mermaid.Utils
@behaviour Reactor.Mermaid
@doc false
@impl true
def to_mermaid(reactor, options) when is_struct(reactor, Reactor) do
id = mermaid_id(reactor.id, :reactor)
with {:ok, reactor} <- Reactor.Planner.plan(reactor),
{:ok, inputs} <- generate_inputs(reactor, options),
{:ok, steps} <- generate_steps(reactor, options) do
return_step_id = mermaid_id({reactor.id, reactor.return}, :step)
return_id = mermaid_id(reactor.id, :return)
{:ok,
%Node{
id: id,
pre: [
"subgraph ",
id,
"[\"",
name(reactor.id),
"\"]"
],
children: [
"\n",
"direction ",
direction(options[:direction]),
"\n",
inputs,
steps,
return_id,
"{\"Return\"}\n",
return_step_id,
"==>",
return_id
],
post: [
"\n",
"end\n"
]
}}
end
end
defp generate_inputs(reactor, options) do
reactor.inputs
|> map_while_ok(&generate_input(&1, reactor, options))
end
defp generate_input(input_name, reactor, options) do
id = mermaid_id({reactor.id, input_name}, :input)
content =
if options[:describe?] do
[
id,
">\"`",
"**Input ",
to_string(input_name),
"**",
"\n",
md_escape(Map.get(reactor.input_descriptions, input_name)),
"`\"]",
"\n"
]
else
[id, ">\"Input ", to_string(input_name), "\"]\n"]
end
{:ok, %Node{id: id, pre: content}}
end
defp generate_steps(reactor, options) do
options = Keyword.put(options, :reactor_id, reactor.id)
reactor.plan
|> Graph.vertices()
|> map_while_ok(&Step.to_mermaid(&1, options))
end
end