mod bus;
mod deliveries;
mod matching;
mod request;
use std::sync::Arc;
pub(crate) use bus::{Bus, BusDelivery};
pub(crate) use deliveries::{BusDeliveries, QueueBehaviour, Settlement};
pub(crate) use request::request;
use crate::convert;
use crate::delay::DelayTarget;
use crate::error::AmqpError;
use crate::queue::{QueueDescriptor, declared_arguments};
use crate::subscriber::LapinSubscriber;
pub(crate) fn subscribe(
bus: &Arc<Bus>,
def: &impl QueueDescriptor,
declares: bool,
) -> Result<LapinSubscriber, AmqpError> {
let spec = def.spec();
def.check_retry(declares)?;
if spec.name.is_empty() {
return Err(AmqpError::InvalidOptions(
"queue name must not be empty; subscribe with the queue the handler consumes"
.to_owned(),
));
}
convert::short(&spec.name, "queue name")?;
bus.ensure_live(&spec.name)?;
if let Some(delay) = &spec.delay {
match delay.target_for(&spec.name) {
DelayTarget::WaitingQueue { waiting_queue } => {
convert::short(&waiting_queue, "waiting queue name")?;
}
#[cfg(feature = "plugin-dme")]
DelayTarget::DelayedExchange { exchange, .. } => {
convert::short(&exchange, "delayed exchange name")?;
}
}
}
let arguments = declared_arguments(spec, def.declared_retry());
bus.describe(spec, &arguments, declares)?;
let behaviour = QueueBehaviour::of(spec, &arguments);
Ok(LapinSubscriber::in_process(
BusDeliveries::open(bus, spec.name.clone(), spec.auto_delete, behaviour),
spec.name.clone(),
spec.batch_wait,
))
}