Current section

Files

Jump to
ferricstore lib ferricstore term_codec.ex
Raw

lib/ferricstore/term_codec.ex

defmodule Ferricstore.TermCodec do
@moduledoc false
@type decode_error :: {:error, :invalid_external_term}
@spec encode(term()) :: binary()
def encode(term), do: :erlang.term_to_binary(term, [:deterministic])
@spec decode(term()) :: {:ok, term()} | decode_error()
def decode(<<131, 80, _compressed::binary>>), do: {:error, :invalid_external_term}
def decode(binary) when is_binary(binary) do
case :erlang.binary_to_term(binary, [:safe, :used]) do
{term, used} when used == byte_size(binary) -> {:ok, term}
_invalid -> {:error, :invalid_external_term}
end
rescue
ArgumentError -> {:error, :invalid_external_term}
end
def decode(_binary), do: {:error, :invalid_external_term}
end