Packages
reactor
1.0.2
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/dsl/template.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.Dsl.Template do
@moduledoc """
The `template` DSL entity struct.
See `d:Reactor.template`.
"""
defstruct __identifier__: nil,
arguments: [],
description: nil,
guards: [],
name: nil,
template: nil,
__spark_metadata__: nil
alias Reactor.{Builder, Dsl, Step}
@type t :: %__MODULE__{
arguments: [Dsl.Argument.t()],
description: nil | String.t(),
guards: [Dsl.Where.t() | Dsl.Guard.t()],
name: atom,
template: String.t(),
__identifier__: any,
__spark_metadata__: Spark.Dsl.Entity.spark_meta()
}
@doc false
def __entity__,
do: %Spark.Dsl.Entity{
name: :template,
describe: """
A step which passes all it's arguments as assigns into an `EEx` template and returns the result.
""",
examples: [
~s|
template :welcome_message do
arguments :user
template """
Welcome <%= @user.name %>! 🎉
"""
end
|
],
args: [:name],
target: __MODULE__,
identifier: :name,
entities: [
arguments: [Dsl.Argument.__entity__(), Dsl.WaitFor.__entity__()],
guards: [Dsl.Where.__entity__(), Dsl.Guard.__entity__()]
],
recursive_as: :steps,
schema: [
name: [
type: :atom,
required: true,
doc: """
A unique name for the step. Used when choosing the return value of the Reactor and for arguments into other steps.
"""
],
description: [
type: :string,
required: false,
doc: """
An optional description for the step.
"""
],
template: [
type: :string,
required: true,
doc: "An `EEx` template."
]
]
}
defimpl Dsl.Build do
def build(template, reactor) do
Builder.add_step(
reactor,
template.name,
{Step.Template, template: template.template},
template.arguments,
async?: true,
description: template.description,
guards: template.guards,
max_retries: 1,
ref: :step_name
)
end
def verify(_template, _dsl_state), do: :ok
end
end