Packages
reactor
0.13.0
1.0.2
1.0.1
1.0.0
0.17.0
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
An asynchronous, graph-based execution engine
Current section
Files
Jump to
Current section
Files
lib/reactor/error.ex
defmodule Reactor.Error do
@moduledoc """
Uses `splode` to manage various classes of error.
"""
use Splode,
error_classes: [
reactor: Reactor.Error.Internal,
invalid: Reactor.Error.Invalid,
unknown: Reactor.Error.Unknown,
validation: Reactor.Error.Validation
],
unknown_error: Reactor.Error.Unknown.UnknownError
@doc "Convenience wrapper around `use Splode.Error`"
@spec __using__(keyword) :: Macro.output()
defmacro __using__(opts) do
quote do
use Splode.Error, unquote(opts)
import Reactor.Error.Utils
import Reactor.Utils
end
end
@doc """
Recursively searches through nested reactor errors for the first instance of
the provided module.
"""
@spec fetch_error(Exception.t(), module) :: {:ok, Exception.t()} | :error
def fetch_error(error, module) when is_exception(error, module), do: {:ok, error}
def fetch_error(error, module) when is_list(error.errors) do
Enum.reduce_while(error.errors, :error, fn error, :error ->
case fetch_error(error, module) do
{:ok, error} -> {:halt, {:ok, error}}
:error -> {:cont, :error}
end
end)
end
def fetch_error(error, module) when is_exception(error.error),
do: fetch_error(error.error, module)
def fetch_error(_error, _module), do: :error
@doc """
Recursively searches through nested reactor errors and returns any errors
which match the provided module name.
"""
@spec find_errors(Exception.t(), module) :: [Exception.t()]
def find_errors(error, module) when is_exception(error, module), do: [error]
def find_errors(error, module) when is_list(error.errors) do
Enum.flat_map(error.errors, &find_errors(&1, module))
end
def find_errors(error, module) when is_exception(error.error),
do: find_errors(error.error, module)
def find_errors(_error, _module), do: []
end