lib/dbf/database_error.ex

defmodule DBF.DatabaseError do
  defexception [:reason, :further_info]
  @type t() :: %__MODULE__{reason: atom}

  @impl true
  @spec message(DBF.DatabaseError.t()) :: String.t()
  def message(%__MODULE__{reason: reason}) do
    format_reason(reason)
  end

  @doc false
  @spec new(atom()) :: DBF.DatabaseError.t()
  @spec new(atom(), String.t()) :: DBF.DatabaseError.t()
  def new(reason, further_info \\ "") do
    %__MODULE__{reason: reason, further_info: further_info}
  end

  defp format_reason(:missing_memo_file), do: "Missing memo file"
  defp format_reason(:invalid_options), do: "Invalid options provided"
  defp format_reason(:unhandled_field_type), do: "We encountered a field type that we don't know how to handle"
  defp format_reason(:unsupported_version), do: "Database version not supported"
  defp format_reason(:enoent), do: "File not found"
  defp format_reason(_), do: "UNKNOWN ERROR"
end