defmodule Zig.ErrorProng do
@moduledoc """
"""
# default parameter errors handling.
def argument_error_prong(:elixir, _) do
quote do
:error, {:argument_error, index, error_lines} ->
new_stacktrace =
case __STACKTRACE__ do
[{_m, _f, a, _opts}, {m, f, _a, opts} | rest] ->
indentation = &["\n ", List.duplicate("| ", &1)]
new_opts =
Keyword.merge(opts,
error_info: %{module: __MODULE__, function: :_format_error},
zigler_error: %{
(index + 1) =>
error_lines
|> Enum.reduce({[], 0}, fn
:enter, {so_far, indents} ->
{so_far, indents + 1}
error_line, {so_far, indents} ->
error_msg =
error_line
|> Tuple.to_list()
|> Enum.map(fn
list when is_list(list) ->
list
string when is_binary(string) ->
string
{:inspect, content} ->
"#{inspect(content, custom_options: [sort_maps: true])}"
{:typename, typename} ->
String.replace(typename, ".#{__MODULE__}.", "")
end)
|> List.wrap()
|> List.insert_at(0, indentation.(indents))
{[error_msg | so_far], indents}
end)
|> elem(0)
|> Enum.reverse()
|> List.insert_at(0, "\n")
|> IO.iodata_to_binary()
}
)
[{m, f, a, new_opts} | rest]
stacktrace ->
stacktrace
end
:erlang.raise(:error, :badarg, new_stacktrace)
end
end
def argument_error_prong(:erlang, _) do
[
"error:{error, badarg, _ExtraStacktrace}:Stacktrace -> erlang:raise(error, badarg, Stacktrace)"
]
end
def error_return_prong(:elixir, ignored) do
stacktrace_prep =
case ignored do
[] ->
quote do
__STACKTRACE__
end
list when is_list(list) ->
quote do
Enum.reject(
__STACKTRACE__,
&match?({__MODULE__, ignore, _, _} when ignore in unquote(ignored), &1)
)
end
end
quote do
:error, {:error, type, extra_stacktrace} ->
stacktrace = unquote(stacktrace_prep)
new_stacktrace =
extra_stacktrace
|> Enum.map(fn %{
compile_unit_name: module_str,
symbol_name: fn_str,
line_info: line_info
} ->
{file, line} = __resolve(line_info)
{String.to_atom(module_str), String.to_atom(fn_str), [:...], [file: file, line: line]}
end)
|> Enum.reverse(stacktrace)
:erlang.raise(:error, type, new_stacktrace)
:error, {:error, type} ->
:erlang.raise(:error, type, [])
end
end
def error_return_prong(:erlang, _) do
["error:{error, Type, _ExtraStacktrace}:Stacktrace -> erlang:raise(error, Type, Stacktrace)"]
end
end