defmodule QuickBEAM.JSError do
defexception [:message, :name, :stack]
@type t :: %__MODULE__{
message: String.t(),
name: String.t(),
stack: String.t() | nil
}
@impl true
def message(%__MODULE__{name: name, message: msg}) do
"#{name}: #{msg}"
end
@doc false
def from_js_value(value) when is_map(value) do
%__MODULE__{
message: to_string(value[:message] || value["message"] || inspect(value)),
name: to_string(value[:name] || value["name"] || "Error"),
stack: get_stack(value)
}
end
def from_js_value(value) when is_binary(value) do
%__MODULE__{message: value, name: "Error", stack: nil}
end
def from_js_value(value) do
%__MODULE__{message: inspect(value), name: "Error", stack: nil}
end
defp get_stack(value) do
case value[:stack] || value["stack"] do
nil -> nil
s -> to_string(s)
end
end
end