# `Minga.Parser.Protocol`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/parser/protocol.ex#L1)

Binary protocol encoding/decoding for the tree-sitter parser Port.

The parser Port (minga-parser) speaks the same wire format as the
frontend Port (minga-renderer). This module owns the parser-specific
opcodes and encode/decode functions. `MingaEditor.Frontend.Protocol`
delegates parser functions here so existing Layer 2 callers work
unchanged.

This is a Layer 0 module. It has no dependencies on MingaEditor.*.

# `conceal_span`

```elixir
@type conceal_span() :: %{
  start_byte: non_neg_integer(),
  end_byte: non_neg_integer(),
  replacement: String.t()
}
```

A conceal span from tree-sitter: byte range + replacement text.

# `edit_delta`

```elixir
@type edit_delta() :: %{
  start_byte: non_neg_integer(),
  old_end_byte: non_neg_integer(),
  new_end_byte: non_neg_integer(),
  start_position: {non_neg_integer(), non_neg_integer()},
  old_end_position: {non_neg_integer(), non_neg_integer()},
  new_end_position: {non_neg_integer(), non_neg_integer()},
  inserted_text: String.t()
}
```

A single edit delta for incremental content sync.

# `decode_event`

```elixir
@spec decode_event(binary()) :: {:ok, term()} | :unknown | {:error, :malformed}
```

Decodes a parser event from a binary payload.

Returns `{:ok, event}` for recognized parser opcodes, `:unknown` for
unrecognized opcodes (which may be input events handled by
`MingaEditor.Frontend.Protocol`), or `{:error, :malformed}` for
truncated data.

# `encode_close_buffer`

```elixir
@spec encode_close_buffer(non_neg_integer()) :: binary()
```

Encodes a close_buffer command: buffer_id(4).

# `encode_edit_buffer`

```elixir
@spec encode_edit_buffer(non_neg_integer(), non_neg_integer(), [edit_delta()]) ::
  binary()
```

Encodes an edit_buffer command with buffer_id, version, and a list of edit deltas.

Each delta describes a replacement: the range [start_byte, old_end_byte) is
replaced with `inserted_text`, producing a range [start_byte, new_end_byte).

# `encode_load_grammar`

```elixir
@spec encode_load_grammar(String.t(), String.t()) :: binary()
```

Encodes a load_grammar command.

# `encode_parse_buffer`

```elixir
@spec encode_parse_buffer(non_neg_integer(), non_neg_integer(), String.t()) ::
  binary()
```

Encodes a parse_buffer command with buffer_id and version counter.

# `encode_query_language_at`

```elixir
@spec encode_query_language_at(
  non_neg_integer(),
  non_neg_integer(),
  non_neg_integer()
) :: binary()
```

Encodes a query_language_at request: buffer_id(4) + request_id(4) + byte_offset(4).

# `encode_request_indent`

```elixir
@spec encode_request_indent(non_neg_integer(), non_neg_integer(), non_neg_integer()) ::
  binary()
```

Encodes a request_indent command: buffer_id(4) + request_id(4) + line(4).

# `encode_request_textobject`

```elixir
@spec encode_request_textobject(
  non_neg_integer(),
  non_neg_integer(),
  non_neg_integer(),
  non_neg_integer(),
  String.t()
) :: binary()
```

Encodes a request_textobject command: buffer_id(4) + request_id(4) + row(4) + col(4) + name_len(2) + name.

# `encode_set_fold_query`

```elixir
@spec encode_set_fold_query(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_fold_query command with buffer_id.

# `encode_set_highlight_query`

```elixir
@spec encode_set_highlight_query(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_highlight_query command with buffer_id.

# `encode_set_indent_query`

```elixir
@spec encode_set_indent_query(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_indent_query command with buffer_id.

# `encode_set_injection_query`

```elixir
@spec encode_set_injection_query(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_injection_query command with buffer_id.

# `encode_set_language`

```elixir
@spec encode_set_language(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_language command with buffer_id.

# `encode_set_textobject_query`

```elixir
@spec encode_set_textobject_query(non_neg_integer(), String.t()) :: binary()
```

Encodes a set_textobject_query command with buffer_id.

---

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