# `SquidMesh.RunStore.Persistence`
[🔗](https://github.com/ccarvalho-eng/squid_mesh/blob/main/lib/squid_mesh/run_store/persistence.ex#L1)

Write-side persistence helpers for workflow runs.

These helpers keep record construction and serialization close to the
database-facing code while `SquidMesh.RunStore` continues to expose the
public lifecycle API.

# `transition_attrs`

```elixir
@type transition_attrs() :: %{
  optional(:context) =&gt; map(),
  optional(:current_step) =&gt; String.t() | atom() | nil,
  optional(:last_error) =&gt; map() | nil
}
```

# `build_run_attrs`

```elixir
@spec build_run_attrs(module(), atom(), SquidMesh.Workflow.Definition.t(), map()) ::
  map()
```

# `cancellation_target_status`

```elixir
@spec cancellation_target_status(SquidMesh.Run.status()) ::
  {:ok, SquidMesh.Run.status()}
  | {:error,
     {:invalid_transition, SquidMesh.Run.status(), SquidMesh.Run.status()}}
```

# `insert_run_record`

```elixir
@spec insert_run_record(module(), map()) ::
  {:ok, SquidMesh.Run.t()} | {:error, {:invalid_run, Ecto.Changeset.t()}}
```

# `insert_run_with_dispatch`

```elixir
@spec insert_run_with_dispatch(module(), map(), (SquidMesh.Run.t() -&gt;
                                             {:ok, term()} | {:error, term()})) ::
  {:ok, SquidMesh.Run.t()}
  | {:error, {:invalid_run, Ecto.Changeset.t()} | term()}
```

# `noop_dispatch`

```elixir
@spec noop_dispatch(SquidMesh.Run.t()) :: {:ok, :noop}
```

# `replay_run_attrs`

```elixir
@spec replay_run_attrs(
  SquidMesh.Persistence.Run.t(),
  SquidMesh.Workflow.Definition.t()
) :: map()
```

# `serialize_transition_attrs`

```elixir
@spec serialize_transition_attrs(map()) :: map()
```

# `transition_changeset_attrs`

```elixir
@spec transition_changeset_attrs(SquidMesh.Run.status(), transition_attrs()) :: map()
```

# `update_run_record`

```elixir
@spec update_run_record(module(), SquidMesh.Persistence.Run.t(), map()) ::
  {:ok, SquidMesh.Run.t()} | {:error, {:invalid_run, Ecto.Changeset.t()}}
```

---

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