lib/error/arke_error.ex

defmodule Arke.Errors.ArkeError do
  alias Arke.Utils.ErrorGenerator, as: Error
  defexception [:message, type: nil]

  def message(%{message: nil}), do: "message is required"

  def message(%{message: msg, type: nil}) when is_binary(msg) do
    {:error, [%{context: context, message: message}]} = Error.create(:arke, msg)
    "context: #{context}, message: #{message}"
  end

  def message(%{message: [%{context: context, message: message}]} = exception),
    do: "context: #{context}, message: #{message}"

  def message(%{message: errors} = exception) when is_list(errors) do
    formatted_errors =
      errors
      |> Enum.map(&format_error/1)
      |> Enum.join("\n")

    "Found multiple errors:\n" <> formatted_errors
  end

  defp format_error(%{context: context, message: message}) do
    "- context: #{context}, message: #{message}"
  end
end