Current section
Files
Jump to
Current section
Files
lib/boltx/pack_stream.ex
defmodule Bolty.PackStream do
@moduledoc false
alias Bolty.PackStream.Packer
alias Bolty.PackStream.Unpacker
def pack(term, options \\ []) do
iodata? = Keyword.get(options, :iodata, false)
try do
Packer.pack(term)
catch
:throw, error ->
{:error, error}
:error, %Protocol.UndefinedError{protocol: Bolty.PackStream.Packer} = exception ->
{:error, exception}
else
iodata when iodata? ->
{:ok, iodata}
iodata ->
{:ok, IO.iodata_to_binary(iodata)}
end
end
@spec pack!(term, Keyword.t()) :: iodata | no_return
def pack!(term, options \\ []) do
case pack(term, options) do
{:ok, result} ->
result
{:error, exception} ->
raise exception
end
end
@spec unpack(binary()) :: list()
def unpack(iodata) do
try do
iodata
|> Unpacker.unpack()
catch
:throw, error ->
{:error, error}
else
value ->
{:ok, value}
end
end
def unpack!(iodata) do
case unpack(iodata) do
{:ok, value} ->
value
{:error, exception} ->
raise exception
end
end
end