defprotocol AthenaWeb.Exception do
@fallback_to_any true
@spec result(exception :: Exception.t()) :: {:ok, term} | {:error, String.t()} | :unknown
def result(exception)
end
defimpl AthenaWeb.Exception, for: Any do
@spec result(exception :: Exception.t()) :: {:ok, term} | {:error, String.t()} | :unknown
def result(%{result: result} = _exception), do: result
def result(_exception), do: :unknown
end
defimpl AthenaWeb.Exception, for: Ecto.NoResultsError do
@spec result(exception :: Exception.t()) :: {:ok, term} | {:error, String.t()} | :unknown
def result(_exception), do: {:ok, nil}
end
defimpl AthenaWeb.Exception, for: Ecto.Query.CastError do
@spec result(exception :: Exception.t()) :: {:ok, term} | {:error, String.t()} | :unknown
def result(_exception), do: {:ok, nil}
end