Skip to content

Commit

Permalink
improvement: raise multiple DslErrors at once
Browse files Browse the repository at this point in the history
  • Loading branch information
zachdaniel committed Sep 24, 2024
1 parent 5b6f9c7 commit 94cace5
Showing 1 changed file with 49 additions and 19 deletions.
68 changes: 49 additions & 19 deletions lib/spark/dsl.ex
Original file line number Diff line number Diff line change
Expand Up @@ -469,26 +469,56 @@ defmodule Spark.Dsl do
|> Spark.Dsl.Transformer.sort()
|> Enum.filter(& &1.after_compile?())

@extensions
|> Enum.flat_map(& &1.verifiers())
|> Enum.each(fn verifier ->
case verifier.verify(@spark_dsl_config) do
:ok ->
:ok

{:warn, warnings} ->
warnings
|> List.wrap()
|> Enum.each(&IO.warn(&1, Macro.Env.stacktrace(__ENV__)))

{:error, error} ->
if is_exception(error) do
raise error
else
raise "Verification error from #{inspect(verifier)}: #{inspect(error)}"
errors =
@extensions
|> Enum.flat_map(& &1.verifiers())
|> Enum.flat_map(fn verifier ->
try do
case verifier.verify(@spark_dsl_config) do
:ok ->
[]

{:warn, warnings} ->
warnings
|> List.wrap()
|> Enum.each(&IO.warn(&1, Macro.Env.stacktrace(__ENV__)))

[]

{:error, error} ->
List.wrap(error)
end
end
end)
rescue
e ->
[e]
end
end)

case Enum.uniq(errors) do
[] ->
:ok

[%Spark.Error.DslError{stacktrace: %{stacktrace: stacktrace}} = error] ->
reraise error, stacktrace

[error] ->
raise error

errors ->
raise Spark.Error.DslError,
message:
"Multiple Errors Occurred\n\n" <>
Enum.map_join(errors, "\n---\n", fn
%Spark.Error.DslError{stacktrace: %{stacktrace: stacktrace}} = error ->
Exception.format(:error, error, stacktrace)

error ->
{:current_stacktrace, stacktrace} =
Process.info(self(), :current_stacktrace)

Exception.format(:error, error, stacktrace)
end)
end

__MODULE__
|> Spark.Dsl.Extension.run_transformers(
Expand Down

0 comments on commit 94cace5

Please sign in to comment.