Current section
Files
Jump to
Current section
Files
lib/boltx/bolt_protocol/message/pull_message.ex
defmodule Bolty.BoltProtocol.Message.PullMessage do
@moduledoc false
import Bolty.BoltProtocol.ServerResponse
alias Bolty.BoltProtocol.MessageEncoder
@signature 0x3F
def encode(bolt_version, extra_parameters)
when is_float(bolt_version) and bolt_version >= 4.0 do
message = [get_extra_parameters(extra_parameters)]
MessageEncoder.encode(@signature, message)
end
def encode(bolt_version, _extra_parameters)
when is_float(bolt_version) and bolt_version <= 3.0 do
MessageEncoder.encode(@signature, [])
end
def encode(_, _) do
{:error,
Bolty.Error.wrap(__MODULE__, %{
code: :unsupported_message_version,
message: "PULL message version not supported"
})}
end
def prepare_messages(bolt_version, messages) do
records = Enum.reduce(messages, [], &group_record/2)
case List.keymember?(messages, :failure, 0) do
true ->
{:error,
Bolty.Error.wrap(__MODULE__, %{
code: messages[:failure]["code"],
message: messages[:failure]["message"]
})}
false ->
success_data =
if bolt_version <= 2.0 do
Map.merge(
%{"t_last" => messages[:success]["result_consumed_after"]},
Map.delete(messages[:success], "result_consumed_after")
)
else
messages[:success]
end
{:ok, pull_result(records: records, success_data: success_data)}
end
end
defp get_extra_parameters(extra_parameters) do
%{
n: Map.get(extra_parameters, :n, -1),
qid: Map.get(extra_parameters, :qid, -1)
}
end
defp group_record({:record, data}, acc) do
[data | acc]
end
defp group_record(_other, acc), do: acc
end