lib/witchcraft/foldable/empty_error.ex

defmodule Witchcraft.Foldable.EmptyError do
  @moduledoc """
  Represent the error state of trying to fold over an empty structure

  ## Examples

      iex> %Witchcraft.Foldable.EmptyError{}
      %Witchcraft.Foldable.EmptyError{
        message: "Unable to process empty data",
        plug_status: 500
      }

  """

  alias __MODULE__

  @type t :: %EmptyError{
          message: String.t(),
          data: any(),
          plug_status: pos_integer()
        }

  @base_message "Unable to process empty data"

  defexception message: @base_message, data: nil, plug_status: 500

  defmacro new(data) do
    quote do
      case __ENV__.function do
        {fun_name, arity} ->
          %EmptyError{
            data: unquote(data),
            message: "Unable to process empty data in #{__MODULE__}.#{fun_name}/#{arity}"
          }

        nil ->
          %EmptyError{data: unquote(data)}
      end
    end
  end
end