defmodule HareMq.Queue do alias HareMq.Configuration @moduledoc """ Module providing functions for managing RabbitMQ queues. This module includes functions for declaring queues and binding them to exchanges. """ @doc """ Bind a queue to an exchange with the specified routing key. ## Parameters - `config`: A `%Configuration{}` struct containing queue configuration. ## Examples HareMq.Queue.bind(%Configuration{channel: channel, queue_name: "my_queue", exchange: "my_exchange", routing_key: "my_routing_key"}) """ def bind(%Configuration{} = config) do AMQP.Queue.bind(config.channel, config.queue_name, config.exchange, routing_key: config.routing_key ) end @doc """ Declare a durable RabbitMQ queue. ## Parameters - `config`: A `%Configuration{}` struct containing queue configuration. ## Examples HareMq.Queue.declare_queue(%Configuration{channel: channel, queue_name: "my_queue", durable: true}) """ def declare_queue(%Configuration{} = config) do AMQP.Queue.declare( config.channel, config.queue_name, durable: config.durable ) end @doc """ Declare a durable RabbitMQ delay queue with specified options. ## Parameters - `config`: A `%Configuration{}` struct containing queue configuration. ## Examples HareMq.Queue.declare_delay_queue(%Configuration{channel: channel, delay_queue_name: "my_queue.delay", exchange: "my_exchange", routing_key: "my_routing_key", delay_in_ms: 5000}) """ def declare_delay_queue(%Configuration{} = config) do AMQP.Queue.declare( config.channel, config.delay_queue_name, durable: config.durable, arguments: [ {"x-dead-letter-exchange", :longstr, config.exchange}, {"x-dead-letter-routing-key", :longstr, config.routing_key}, {"x-message-ttl", :long, config.delay_in_ms} ] ) end @doc """ Declare a durable RabbitMQ dead letter queue with specified options. ## Parameters - `config`: A `%Configuration{}` struct containing queue configuration. ## Examples HareMq.Queue.declare_dead_queue(%Configuration{channel: channel, dead_queue_name: "my_queue.dead", message_ttl: 3600000}) """ def declare_dead_queue(%Configuration{} = config) do AMQP.Queue.declare( config.channel, config.dead_queue_name, durable: config.durable, arguments: [ {"x-message-ttl", :long, config.message_ttl} ] ) end end