lib/arangox/error.ex

defmodule Arangox.Error do
  @type t :: %__MODULE__{
          endpoint: Arangox.endpoint() | nil,
          status: pos_integer | nil,
          error_num: non_neg_integer,
          message: binary
        }

  @keys [
    :endpoint,
    :status,
    :error_num
  ]

  defexception [{:message, "arangox error"} | @keys]

  def message(%__MODULE__{message: message} = exception) when is_binary(message) do
    prepend(exception) <> message
  end

  def message(%__MODULE__{message: message} = exception) do
    prepend(exception) <> inspect(message)
  end

  defp prepend(%__MODULE__{} = exception) do
    for key <- @keys, into: "" do
      exception
      |> Map.get(key)
      |> prepend()
    end
  end

  defp prepend(nil), do: ""
  defp prepend(key), do: "[#{key}] "
end