diff --git a/lib/ash/error/error.ex b/lib/ash/error/error.ex index cfc948c0..c8ccd890 100644 --- a/lib/ash/error/error.ex +++ b/lib/ash/error/error.ex @@ -575,10 +575,17 @@ defmodule Ash.Error do defp header(:framework), do: "Framework Error" defp header(:unknown), do: "Unknown Error" - defp breadcrumb(nil), do: "" - defp breadcrumb([]), do: "" + @doc false + def breadcrumb(nil), do: "" + def breadcrumb([]), do: "" - defp breadcrumb(error_context) do - "Context: " <> Enum.join(error_context, " > ") <> "\n" + def breadcrumb(error_context) do + case Enum.filter(error_context, & &1) do + [] -> + "" + + bread_crumbs -> + "Context: " <> Enum.join(bread_crumbs, " > ") <> "\n" + end end end diff --git a/lib/ash/error/forbidden.ex b/lib/ash/error/forbidden.ex index 73b2a106..4184622b 100644 --- a/lib/ash/error/forbidden.ex +++ b/lib/ash/error/forbidden.ex @@ -8,12 +8,16 @@ defmodule Ash.Error.Forbidden do defimpl Ash.ErrorKind do def id(_), do: Ash.UUID.generate() - def message(%{errors: errors, stacktraces?: stacktraces?}) when not is_nil(errors) do - Ash.Error.error_messages(errors, nil, stacktraces?) - end + def message(%{errors: errors, stacktraces?: stacktraces?, error_context: error_context}) do + messages = Ash.Error.error_messages(errors, nil, stacktraces?) - def message(%{errors: errors}) do - Ash.Error.error_descriptions(errors) + case Ash.Error.breadcrumb(error_context) do + "" -> + messages + + error_context -> + error_context <> "\n" <> messages + end end def code(_), do: "Forbidden" diff --git a/lib/ash/error/framework.ex b/lib/ash/error/framework.ex index ed7167d1..e6235fcc 100644 --- a/lib/ash/error/framework.ex +++ b/lib/ash/error/framework.ex @@ -9,8 +9,16 @@ defmodule Ash.Error.Framework do def code(_), do: "framework" - def message(%{errors: errors, stacktraces?: stacktraces?}) do - Ash.Error.error_messages(errors, nil, stacktraces?) + def message(%{errors: errors, stacktraces?: stacktraces?, error_context: error_context}) do + messages = Ash.Error.error_messages(errors, nil, stacktraces?) + + case Ash.Error.breadcrumb(error_context) do + "" -> + messages + + error_context -> + error_context <> "\n" <> messages + end end end end diff --git a/lib/ash/error/invalid.ex b/lib/ash/error/invalid.ex index af4496b0..a9c1c7ce 100644 --- a/lib/ash/error/invalid.ex +++ b/lib/ash/error/invalid.ex @@ -9,8 +9,16 @@ defmodule Ash.Error.Invalid do def code(_), do: "invalid" - def message(%{errors: errors, stacktraces?: stacktraces?}) do - Ash.Error.error_messages(errors, nil, stacktraces?) + def message(%{errors: errors, stacktraces?: stacktraces?, error_context: error_context}) do + messages = Ash.Error.error_messages(errors, nil, stacktraces?) + + case Ash.Error.breadcrumb(error_context) do + "" -> + messages + + error_context -> + error_context <> "\n" <> messages + end end end end diff --git a/lib/ash/error/unknown.ex b/lib/ash/error/unknown.ex index 6478e2a2..84382115 100644 --- a/lib/ash/error/unknown.ex +++ b/lib/ash/error/unknown.ex @@ -17,8 +17,16 @@ defmodule Ash.Error.Unknown do def code(_), do: "unknown" - def message(%{errors: errors, stacktraces?: stacktraces?}) do - Ash.Error.error_messages(errors, nil, stacktraces?) + def message(%{errors: errors, stacktraces?: stacktraces?, error_context: error_context}) do + messages = Ash.Error.error_messages(errors, nil, stacktraces?) + + case Ash.Error.breadcrumb(error_context) do + "" -> + messages + + error_context -> + error_context <> "\n" <> messages + end end end end