# `Mobus.Stepwise.EngineBehaviour`
[🔗](https://github.com/fosferon/mobus_stepwise/blob/main/lib/mobus/stepwise/engine_behaviour.ex#L1)

Behaviour contract for stepwise engines.

Engines must be deterministic under `sync: true` execution, enabling
reliable unit tests and debugging.

# `checkpoint`

```elixir
@callback checkpoint(Mobus.Stepwise.Types.runtime()) :: map()
```

# `get_state`

```elixir
@callback get_state(Mobus.Stepwise.Types.runtime()) ::
  Mobus.Stepwise.Projection.t() | map()
```

# `handle_event`

```elixir
@callback handle_event(
  Mobus.Stepwise.Types.runtime(),
  Mobus.Stepwise.Types.event(),
  Mobus.Stepwise.Types.payload()
) ::
  {:ok, Mobus.Stepwise.Types.runtime()}
  | {:wait, Mobus.Stepwise.Types.runtime(), Mobus.Stepwise.Types.wait_cfg()}
  | {:error, Mobus.Stepwise.Types.reason(), Mobus.Stepwise.Types.runtime()}
```

# `init`

```elixir
@callback init(Mobus.Stepwise.Types.spec(), Mobus.Stepwise.Types.runtime_context()) ::
  {:ok, Mobus.Stepwise.Types.runtime()}
  | {:wait, Mobus.Stepwise.Types.runtime(), Mobus.Stepwise.Types.wait_cfg()}
  | {:error, Mobus.Stepwise.Types.reason()}
  | {:error,
     {:initial_entry_action_failed, Mobus.Stepwise.Types.reason(),
      Mobus.Stepwise.Types.runtime()}}
```

# `restore`

```elixir
@callback restore(
  Mobus.Stepwise.Types.spec(),
  map(),
  Mobus.Stepwise.Types.runtime_context()
) ::
  {:ok, Mobus.Stepwise.Types.runtime()}
  | {:error, Mobus.Stepwise.Types.reason()}
```

---

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