Skip to main content

lib/quickbeam/js_error.ex

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