# `ExWapp.AppState.Engine.Builders`
[🔗](https://github.com/elchemista/ex_wapp/blob/v0.1.5/lib/ex_wapp/appstate/engine/builders.ex#L1)

Builders for outgoing app-state mutations.

Each helper returns a logical patch description that mirrors one user action
such as archiving a chat or updating a contact. The encoder later turns these
maps into protobuf payloads and cryptographic MACs.

# `message_range`

```elixir
@type message_range() :: WAWebProtobufSyncAction.SyncActionMessageRange.t()
```

# `patch_info`

```elixir
@type patch_info() :: %{
  type: String.t(),
  mutations: [map()],
  timestamp: integer() | nil
}
```

# `build_archive`

```elixir
@spec build_archive(String.t(), boolean(), integer() | nil) :: patch_info()
```

Builds an archive or unarchive mutation for a chat.

When archiving we also emit the unpin mutation that WhatsApp Web sends, so
the local behavior stays aligned with the server's expectations.

# `build_clear_chat`

```elixir
@spec build_clear_chat(String.t(), integer() | nil) :: patch_info()
```

Builds a clear-chat mutation.

# `build_contact`

```elixir
@spec build_contact(String.t(), String.t(), String.t() | nil) :: patch_info()
```

Builds a contact upsert mutation.

# `build_delete_chat`

```elixir
@spec build_delete_chat(String.t(), integer() | nil) :: patch_info()
```

Builds a delete-chat mutation.

# `build_delete_contact`

```elixir
@spec build_delete_contact(String.t()) :: patch_info()
```

Builds a remove mutation for a contact.

# `build_mark_read`

```elixir
@spec build_mark_read(String.t(), boolean(), integer() | nil) :: patch_info()
```

Builds a mark-read or mark-unread mutation for a chat.

# `build_mute`

```elixir
@spec build_mute(String.t(), boolean(), integer()) :: patch_info()
```

Builds a mute or unmute mutation for a chat.

# `build_pin`

```elixir
@spec build_pin(String.t(), boolean()) :: patch_info()
```

Builds a pin or unpin mutation for a chat.

---

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