Current section
Files
Jump to
Current section
Files
lib/cql.ex
defmodule CQL do
@moduledoc false
def decode(buffer) do
with {:ok, frame} <- CQL.Frame.decode(buffer) do
{:ok, decode_body(frame)}
else
_ -> CQL.Error.new("unexpected bytes")
end
end
def decode_error(frame) do
if CQL.Frame.is_error?(frame) do
with {:ok, %CQL.Frame{body: error}} <- decode(frame) do
error
end
else
{:ok, frame}
end
end
def decode_body(nil), do: nil
def decode_body(%CQL.Frame{operation: operation, body: body} = frame) do
body = case operation do
:ERROR -> CQL.Error.decode(body)
:READY -> CQL.Ready.decode(body)
:RESULT -> CQL.Result.decode(body)
:SUPPORTED -> CQL.Supported.decode(body)
:EVENT -> CQL.Event.decode(body)
_ -> body
end
%CQL.Frame{frame | body: body}
end
def encode(request, stream \\ 0) do
with {operation, body} <- CQL.Request.encode(request) do
frame = %CQL.Frame{operation: operation, body: body, stream: stream}
cql = CQL.Frame.encode(frame)
{:ok, cql}
end
end
def encode!(request, stream \\ 0) do
with {:ok, cql} <- encode(request, stream) do
cql
else
error -> raise error
end
end
defdelegate set_stream_id(request, id), to: CQL.Frame
end