diff --git a/lib/excache/resp/encoder.ex b/lib/excache/resp/encoder.ex new file mode 100644 index 0000000..d1ecd46 --- /dev/null +++ b/lib/excache/resp/encoder.ex @@ -0,0 +1,24 @@ +defmodule Excache.RESP.Encoder do + @moduledoc false + + @crlf "\r\n" + + @type value :: + {:simple, iodata} + | {:error, iodata} + | {:integer, integer} + | {:bulk, binary | nil} + | {:array, [value] | nil} + + @spec encode(value) :: iodata + def encode({:simple, text}), do: ["+", text, @crlf] + def encode({:error, text}), do: ["-", text, @crlf] + def encode({:integer, number}), do: [":", Integer.to_string(number), @crlf] + def encode({:bulk, nil}), do: ["$-1", @crlf] + def encode({:bulk, bin}), do: ["$", Integer.to_string(byte_size(bin)), @crlf, bin, @crlf] + def encode({:array, nil}), do: ["*-1", @crlf] + + def encode({:array, items}) do + ["*", Integer.to_string(length(items)), @crlf, Enum.map(items, &encode/1)] + end +end