lib/reactor/step/transform_all.ex

defmodule Reactor.Step.TransformAll do
  @moduledoc """
  A built-in step which applies a transformation function to all it's arguments.

  The returned map is used as the arguments to the step, instead of the step's
  defined arguments.
  """

  use Reactor.Step
  alias Reactor.{Error.TransformError, Step.Transform}

  @doc false
  @impl true
  @spec run(Reactor.inputs(), Reactor.context(), keyword) :: {:ok | :error, any}
  def run(arguments, context, options) do
    case Transform.run(%{value: arguments}, context, options) do
      {:ok, result} when is_map(result) ->
        {:ok, result}

      {:ok, result} ->
        {:error,
         TransformError.exception(
           input: arguments,
           output: result,
           message: "Step transformers must return a map to use as replacement arguments."
         )}

      {:error, reason} ->
        {:error, reason}
    end
  end
end