lib/mint/web_socket_error.ex

defmodule Mint.WebSocketError do
  @moduledoc """
  Represents an error in the WebSocket protocol

  The `Mint.WebSocketError` struct is an exception, so it can be raised as
  any other exception.
  """

  reason_type =
    quote do
      :extended_connect_disabled
      | :payload_too_large
      | {:extension_not_negotiated, Mint.WebSocket.Extension.t()}
    end

  @type t :: %__MODULE__{reason: unquote(reason_type) | term()}

  defexception [:reason]

  @impl Exception
  def message(%__MODULE__{reason: reason}) do
    format_reason(reason)
  end

  defp format_reason(:extended_connect_disabled) do
    "extended CONNECT method not enabled"
  end

  defp format_reason(:payload_too_large) do
    "frame payload cannot exceed 9,223,372,036,854,775,807 bytes"
  end

  defp format_reason({:extension_not_negotiated, extension}) do
    "the remote server accepted an extension the client did not offer: #{inspect(extension)}"
  end
end