# `QuackDB.Protocol.Reader`
[🔗](https://github.com/elixir-vibe/quackdb/blob/main/lib/quack_db/protocol/reader.ex#L1)

Binary reader primitives for the Quack wire format.

Provides field ids, LEB128 integers, strings/blobs, nullable values, optional
indexes, fixed-width numbers, and DuckDB hugeint decoding with structured
protocol errors on malformed input.

# `read_result`

```elixir
@type read_result(value) :: {:ok, value, binary()} | {:error, QuackDB.Error.t()}
```

# `read_blob`

```elixir
@spec read_blob(binary()) :: read_result(binary())
```

# `read_bool`

```elixir
@spec read_bool(binary()) :: read_result(boolean())
```

# `read_field_id`

```elixir
@spec read_field_id(binary()) :: read_result(non_neg_integer())
```

# `read_float32`

```elixir
@spec read_float32(binary()) :: read_result(float())
```

# `read_float64`

```elixir
@spec read_float64(binary()) :: read_result(float())
```

# `read_hugeint`

```elixir
@spec read_hugeint(binary()) :: read_result(integer())
```

# `read_int8`

```elixir
@spec read_int8(binary()) :: read_result(integer())
```

# `read_int16`

```elixir
@spec read_int16(binary()) :: read_result(integer())
```

# `read_int32`

```elixir
@spec read_int32(binary()) :: read_result(integer())
```

# `read_int64`

```elixir
@spec read_int64(binary()) :: read_result(integer())
```

# `read_list`

```elixir
@spec read_list(binary(), (binary() -&gt; read_result(value))) :: read_result([value])
when value: term()
```

# `read_nullable`

```elixir
@spec read_nullable(binary(), (binary() -&gt; read_result(value))) ::
  read_result(value | nil)
when value: term()
```

# `read_optional_index`

```elixir
@spec read_optional_index(binary()) :: read_result(non_neg_integer() | nil)
```

# `read_sleb128`

```elixir
@spec read_sleb128(binary()) :: read_result(integer())
```

# `read_string`

```elixir
@spec read_string(binary()) :: read_result(String.t())
```

# `read_uint8`

```elixir
@spec read_uint8(binary()) :: read_result(non_neg_integer())
```

# `read_uint16`

```elixir
@spec read_uint16(binary()) :: read_result(non_neg_integer())
```

# `read_uint32`

```elixir
@spec read_uint32(binary()) :: read_result(non_neg_integer())
```

# `read_uint64`

```elixir
@spec read_uint64(binary()) :: read_result(non_neg_integer())
```

# `read_uleb128`

```elixir
@spec read_uleb128(binary()) :: read_result(non_neg_integer())
```

# `take`

```elixir
@spec take(binary(), non_neg_integer()) :: read_result(binary())
```

---

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