Current section
Files
Jump to
Current section
Files
lib/retort/queue.ex
defmodule Retort.Queue do
@moduledoc """
Extensions to `AMQP.Queue`
"""
# Types
@typedoc """
The name of a queue
"""
@type t :: String.t
# Functions
@doc """
Whether `queue` exists
"""
@spec exists?(t, %AMQP.Channel{}) :: boolean
def exists?(queue, channel = %AMQP.Channel{}) when is_binary(queue) do
not_found_message = "NOT_FOUND - no queue '#{queue}' in vhost '/'"
try do
AMQP.Queue.status(channel, queue)
catch
:exit, {{:shutdown, {:server_initiated_close, 404, ^not_found_message}}, _} -> false
else
{:ok, %{consumer_count: _, message_count: _, queue: ^queue}} -> true
end
end
@doc """
Deletes `queue` if it exists
"""
@spec ensure_deleted(String.t, %AMQP.Channel{}) :: :ok | :already_deleted | {:error, :channel_closed}
def ensure_deleted(queue, channel = %AMQP.Channel{}) when is_binary(queue) do
delete(queue, channel)
catch
:exit, _ -> {:error, :channel_closed}
end
## Private Functions
defp delete(queue, channel) do
if exists?(queue, channel) do
case AMQP.Queue.delete(channel, queue) do
{:ok, _} -> :ok
end
else
:already_deleted
end
end
end