Packages
reactor
1.0.1
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/step.ex
# SPDX-FileCopyrightText: 2023 James Harton, Zach Daniel, Alembic Pty and contributors
# SPDX-FileCopyrightText: 2023 reactor contributors <https://github.com/ash-project/reactor/graphs/contributors>
#
# SPDX-License-Identifier: MIT
defmodule Reactor.Mermaid.Step do
@moduledoc false
import Reactor.Utils
import Reactor.Mermaid.Utils
alias Reactor.Mermaid.{Argument, Node}
@behaviour Reactor.Mermaid
@doc false
@impl true
def to_mermaid(step, options) do
with {:ok, step_node} <- render_step(step, options),
{:ok, arguments} <-
generate_arguments(step.arguments, Keyword.put(options, :target_id, step_node.id)) do
{:ok, %{step_node | pre: [arguments, step_node.pre]}}
end
end
defp generate_arguments(arguments, options) do
arguments
|> map_while_ok(&Argument.to_mermaid(&1, options))
end
defp render_step(step, options) do
module = impl_for(step)
if Spark.implements_behaviour?(module, Reactor.Mermaid) do
module.to_mermaid(step, options)
else
default_describe_step(step, module, options)
end
end
@doc false
def default_describe_step(step, module, options) do
id = mermaid_id({options[:reactor_id], step.name}, :step)
content =
if options[:describe?] do
[
id,
"[\"`**",
md_escape(name(step.name)),
" \\(",
inspect(module),
"\\)**\n",
md_escape(step.description),
"`\"]\n"
]
else
[
id,
"[\"",
name(step.name),
"(",
inspect(module),
")\"]\n"
]
end
{:ok, %Node{id: id, pre: content}}
end
defp impl_for(%{impl: {module, _}}) when is_atom(module), do: module
defp impl_for(%{impl: module}) when is_atom(module), do: module
end