lib/edgedb/wrapped_connection.ex

defmodule EdgeDB.WrappedConnection do
  @moduledoc """
  A structure to wrap a connection to EdgeDB.

  This is used in driver internally for changing the behaviour of
    operations. See `EdgeDB.as_readonly/1`, `EdgeDB.with_retry_options/2`
    and `EdgeDB.with_transaction_options/2` for more information.
  """

  defstruct [
    :conn,
    :callbacks
  ]

  @typep callback() :: (DBConnection.conn(), callback() -> any())
  @typep conn() :: %__MODULE__{
           conn: DBConnection.conn(),
           callbacks: list(callback())
         }

  @typedoc """
  Wrapped connection.
  """
  @opaque t() :: %__MODULE__{}

  @doc false
  @spec wrap(conn() | DBConnection.conn(), callback()) :: t()

  def wrap(%__MODULE__{} = conn, callback) do
    %__MODULE__{conn | callbacks: [callback | conn.callbacks]}
  end

  def wrap(conn, callback) do
    %__MODULE__{conn: conn, callbacks: [callback]}
  end
end