defmodule Reactor.Dsl.WaitFor do
@moduledoc """
The struct used to store `wait_for` DSL entities.
See `d:Reactor.step.wait_for`.
"""
defstruct __identifier__: nil, names: []
alias Reactor.{Argument, Dsl}
import Reactor.Utils
@type t :: %Dsl.WaitFor{names: [atom], __identifier__: any}
@doc false
def __entity__,
do: %Spark.Dsl.Entity{
name: :wait_for,
describe: """
Wait for the named step to complete before allowing this one to start.
Desugars to `argument :_, result(step_to_wait_for)`
""",
examples: ["wait_for :create_user"],
args: [:names],
target: Dsl.WaitFor,
schema: [
names: [
type: {:wrap_list, :atom},
required: true,
doc: """
The name of the step to wait for.
"""
]
]
}
defimpl Argument.Build do
def build(wait_for) do
wait_for
|> Map.get(:names, [])
|> map_while_ok(fn name ->
{:ok, Argument.from_result(:_, name)}
end)
end
end
end