lib/amqp/channel.ex

defmodule Amqpx.Channel do
  @moduledoc """
  Functions to operate on Channels.
  """

  alias Amqpx.{Channel, Connection}

  defstruct [:conn, :pid]
  @type t :: %Channel{conn: Connection.t(), pid: pid}

  @doc """
  Opens a new Channel in a previously opened Connection.
  """
  @spec open(Connection.t()) :: {:ok, Channel.t()} | {:error, any}
  def open(%Connection{pid: pid} = conn) do
    case :amqp_connection.open_channel(pid) do
      {:ok, chan_pid} -> {:ok, %Channel{conn: conn, pid: chan_pid}}
      error -> error
    end
  end

  @spec open(Connection.t(), pid()) :: {:ok, Channel.t()} | {:error, any}
  def open(%Connection{pid: pid} = conn, consumer_pid) do
    case :amqp_connection.open_channel(pid, {:amqp_direct_consumer, [consumer_pid]}) do
      {:ok, chan_pid} -> {:ok, %Channel{conn: conn, pid: chan_pid}}
      error -> error
    end
  end

  @doc """
  Closes an open Channel.
  """
  @spec close(Channel.t()) :: :ok | {:error, Amqpx.Basic.error()}
  def close(%Channel{pid: pid}) do
    case :amqp_channel.close(pid) do
      :ok -> :ok
      error -> {:error, error}
    end
  end
end