lib/ash/error/forbidden.ex

defmodule Ash.Error.Forbidden do
  @moduledoc "Used when authorization for an action fails"

  use Ash.Error.Exception

  def_ash_error([:errors], class: :forbidden)

  @type t :: %__MODULE__{}

  defimpl Ash.ErrorKind do
    def id(_), do: Ash.UUID.generate()

    def message(%{errors: errors, stacktrace: %{stacktrace: stacktrace}} = error)
        when is_nil(errors) or errors == [] do
      Ash.Error.breadcrumb(error.error_context) <>
        "* Forbidden\n" <>
        Enum.map_join(stacktrace || "", "\n", fn stack_item ->
          "  " <> Exception.format_stacktrace_entry(stack_item)
        end)
    end

    def message(%{errors: errors}) do
      Ash.Error.error_messages(errors || [], nil)
    end

    def code(_), do: "forbidden"
  end
end