# `ExWapp.Message.Handler.Wire.Fields`
[🔗](https://github.com/elchemista/ex_wapp/blob/v0.1.5/lib/ex_wapp/message/handler/wire/fields.ex#L1)

Pure protobuf wire-field primitives, independent of the generated protos.

This module knows wire types, varints, fixed-width numbers, and
length-delimited fields. It has no knowledge of WhatsApp message kinds.

Production decoding now goes through the generated `WAWebProtobufs*` modules;
these primitives remain as the second, independent reader that the wire-format
tests use to pin the exact bytes we put on (and read off) the wire.

# `wire_field`

```elixir
@type wire_field() :: {non_neg_integer(), 0 | 1 | 2 | 5, term()}
```

# `all_length_delimited`

```elixir
@spec all_length_delimited([wire_field()], non_neg_integer()) :: [binary()]
```

Returns every length-delimited value for a field in decoded order.

# `bool`

```elixir
@spec bool(binary(), non_neg_integer()) :: boolean() | nil
```

Returns a protobuf boolean field value or nil.

# `bytes`

```elixir
@spec bytes(binary(), non_neg_integer()) :: binary() | nil
```

Returns a binary field value or nil.

# `collect_length_delimited_values`

```elixir
@spec collect_length_delimited_values(binary()) ::
  {:ok, [binary()]} | {:error, term()}
```

Collects every length-delimited value in a protobuf payload.

# `decode_safe`

```elixir
@spec decode_safe(binary()) :: {:ok, [wire_field()]} | {:error, term()}
```

Decodes all supported protobuf fields without raising.

# `double`

```elixir
@spec double(binary(), non_neg_integer()) :: float() | nil
```

Returns a fixed64 double field value or nil.

# `find_length_delimited`

```elixir
@spec find_length_delimited(binary(), non_neg_integer()) ::
  {:ok, binary()} | {:error, term()}
```

Finds a length-delimited field directly in a protobuf payload.

# `first_length_delimited`

```elixir
@spec first_length_delimited([wire_field()], non_neg_integer()) :: binary() | nil
```

Finds the first length-delimited value in an already-decoded field list.

# `first_varint`

```elixir
@spec first_varint([wire_field()], non_neg_integer()) :: integer() | nil
```

Finds the first varint value in an already-decoded field list.

# `float`

```elixir
@spec float(binary(), non_neg_integer()) :: float() | nil
```

Returns a fixed32 float field value or nil.

# `varint`

```elixir
@spec varint(binary(), non_neg_integer()) :: integer() | nil
```

Returns a varint field value or nil.

---

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