# `Ash.Reactor.Step`
[🔗](https://github.com/ash-project/ash/blob/v3.24.3/lib/ash/reactor/step.ex#L5)

Minimal behaviour for reactor step modules invoked by `Ash.Reactor.AshStep`.

Step modules passed via `ash_step name, impl: MyStep` are called through the
wrappers in this module so that return values are validated. The callbacks
mirror the interface expected by `Reactor.Step` (run/3, compensate/4, undo/4).

# `compensate_result`

```elixir
@type compensate_result() ::
  :ok
  | :retry
  | {:continue, term()}
  | {:error, term()}
  | {:retry, term()}
  | {:ok, term(), list()}
  | {:ok, term(), list(), list()}
```

# `run_result`

```elixir
@type run_result() ::
  {:ok, term()}
  | {:ok, term(), list()}
  | {:ok, term(), list(), list()}
  | {:error, term()}
  | :retry
  | {:halt | :error | :retry, term()}
```

# `undo_result`

```elixir
@type undo_result() ::
  :ok
  | :retry
  | {:error, term()}
  | {:retry, term()}
  | {:ok, term(), list()}
  | {:ok, term(), list(), list()}
```

# `compensate`
*optional* 

```elixir
@callback compensate(any(), Reactor.inputs(), Reactor.context(), keyword()) ::
  compensate_result()
```

# `run`

```elixir
@callback run(Reactor.inputs(), Reactor.context(), keyword()) :: run_result()
```

# `undo`
*optional* 

```elixir
@callback undo(any(), Reactor.inputs(), Reactor.context(), keyword()) :: undo_result()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
