RESP2 and RESP3 protocol parser and encoder for Elixir.

Supports the full RESP2 and RESP3 specifications including all aggregate and streamed types. Continuation-based parsing for TCP streaming.

Parsing

{:ok, arr, ""} = Resp.parse("*2\r\n$3\r\nGET\r\n$3\r\nkey\r\n")
arr.data
#=> [%Resp.Bulk{data: "GET"}, %Resp.Bulk{data: "key"}]

Encoding

Resp.encode_string("OK")
#=> "+OK\r\n"

Summary

Functions

Encodes any Elixir value to its RESP representation (default RESP3 mode).

Encodes any Elixir value with mode awareness.

Encodes an array header.

Encodes a RESP3 attribute header.

Encodes a RESP3 big number.

Encodes a RESP3 bulk error.

Encodes a RESP3 boolean.

Encodes a bulk string.

Encodes a RESP3 double.

Encodes an error.

Encodes an integer.

Encodes a RESP3 map header.

Encodes RESP3 null (_\r\n).

Encodes RESP2 null ($-1\r\n).

Encodes a RESP3 push header.

Encodes raw data (passthrough).

Encodes a RESP3 set header.

Encodes a simple string.

Encodes a RESP3 verbatim string with encoding prefix.

Generates server-info response for the HELLO command. :resp2 returns an array, :resp3 returns a map.

Packs a list of arguments as a RESP2 array of bulk strings.

Parses a RESP command from binary data.

Parses a streamed RESP type header and returns a chunk function.

Parses any RESP2 or RESP3 typed value from binary data.

Functions

encode_any(value)

Encodes any Elixir value to its RESP representation (default RESP3 mode).

See encode_any/2 for mode-aware encoding.

encode_any(n, arg2)

@spec encode_any(term(), :resp2 | :resp3) :: iodata()

Encodes any Elixir value with mode awareness.

In RESP2 mode: nil → $-1, booleans → integers. In RESP3 mode: nil → _, booleans → #t/#f.

encode_array(n)

@spec encode_array(integer()) :: iodata()

Encodes an array header.

encode_attribute(n)

@spec encode_attribute(integer()) :: iodata()

Encodes a RESP3 attribute header.

encode_big_number(s)

@spec encode_big_number(String.t()) :: iodata()

Encodes a RESP3 big number.

encode_blob_error(msg)

@spec encode_blob_error(String.t()) :: iodata()

Encodes a RESP3 bulk error.

encode_bool(bool)

@spec encode_bool(boolean()) :: iodata()

Encodes a RESP3 boolean.

encode_bulk(data)

@spec encode_bulk(binary()) :: iodata()

Encodes a bulk string.

encode_double(f)

@spec encode_double(float() | :infinity | :neg_infinity | :nan) :: iodata()

Encodes a RESP3 double.

encode_error(msg)

@spec encode_error(String.t()) :: iodata()

Encodes an error.

encode_integer(n)

@spec encode_integer(integer()) :: iodata()

Encodes an integer.

encode_map(n)

@spec encode_map(integer()) :: iodata()

Encodes a RESP3 map header.

encode_null3()

@spec encode_null3() :: iodata()

Encodes RESP3 null (_\r\n).

encode_null()

@spec encode_null() :: iodata()

Encodes RESP2 null ($-1\r\n).

encode_push(n)

@spec encode_push(integer()) :: iodata()

Encodes a RESP3 push header.

encode_raw(data)

@spec encode_raw(iodata()) :: iodata()

Encodes raw data (passthrough).

encode_set(n)

@spec encode_set(integer()) :: iodata()

Encodes a RESP3 set header.

encode_string(s)

@spec encode_string(String.t()) :: iodata()

Encodes a simple string.

encode_verbatim_string(enc, s)

@spec encode_verbatim_string(String.t(), String.t()) :: iodata()

Encodes a RESP3 verbatim string with encoding prefix.

hello(atom)

@spec hello(:resp2 | :resp3) :: iodata()

Generates server-info response for the HELLO command. :resp2 returns an array, :resp3 returns a map.

pack(items)

@spec pack([String.Chars.t()]) :: iodata()

Packs a list of arguments as a RESP2 array of bulk strings.

parse(data)

@spec parse(binary()) :: {:ok, Resp.Array.t(), binary()} | {:continuation, function()}

Parses a RESP command from binary data.

Returns {:ok, %Resp.Array{}, rest} for RESP2 arrays and inline/telnet commands. Returns {:continuation, fun} when more data is needed. Raises Resp.ParseError on protocol violations.

parse_stream(data)

@spec parse_stream(binary()) ::
  {:streamed, function(), binary()} | {:continuation, function()}

Parses a streamed RESP type header and returns a chunk function.

Returns {:streamed, chunk_fun, rest} where chunk_fun is called with subsequent data and returns {:chunk, data, rest} or {:done, rest}.

parse_value(data)

Parses any RESP2 or RESP3 typed value from binary data.

Returns {:ok, %Resp.*{}, rest} where the struct type matches the type byte. Returns {:continuation, fun} when more data is needed.