use crate::errors::*;
use crate::{Channel, Delivery, FieldTable};
use crossbeam_channel::Receiver;
use std::cell::Cell;
#[derive(Clone, Debug, Default)]
pub struct ConsumerOptions {
pub no_local: bool,
pub no_ack: bool,
pub exclusive: bool,
pub arguments: FieldTable,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug)]
pub enum ConsumerMessage {
Delivery(Delivery),
ClientCancelled,
ServerCancelled,
ClientClosedChannel,
ServerClosedChannel(Error),
ClientClosedConnection,
ServerClosedConnection(Error),
}
pub struct Consumer<'a> {
channel: &'a Channel,
consumer_tag: String,
rx: Receiver<ConsumerMessage>,
cancelled: Cell<bool>,
}
impl Drop for Consumer<'_> {
fn drop(&mut self) {
let _ = self.cancel();
}
}
impl Consumer<'_> {
pub(crate) fn new(
channel: &Channel,
consumer_tag: String,
rx: Receiver<ConsumerMessage>,
) -> Consumer {
Consumer {
channel,
consumer_tag,
rx,
cancelled: Cell::new(false),
}
}
#[inline]
pub fn consumer_tag(&self) -> &str {
&self.consumer_tag
}
#[inline]
pub fn receiver(&self) -> &Receiver<ConsumerMessage> {
&self.rx
}
pub fn cancel(&self) -> Result<()> {
if self.cancelled.get() {
return Ok(());
}
self.cancelled.set(true);
self.channel.basic_cancel(&self)
}
#[inline]
pub fn ack(&self, delivery: Delivery) -> Result<()> {
delivery.ack(self.channel)
}
#[inline]
pub fn ack_multiple(&self, delivery: Delivery) -> Result<()> {
delivery.ack_multiple(self.channel)
}
#[inline]
pub fn nack(&self, delivery: Delivery, requeue: bool) -> Result<()> {
delivery.nack(self.channel, requeue)
}
#[inline]
pub fn nack_multiple(&self, delivery: Delivery, requeue: bool) -> Result<()> {
delivery.nack_multiple(self.channel, requeue)
}
#[inline]
pub fn reject(&self, delivery: Delivery, requeue: bool) -> Result<()> {
self.channel.basic_reject(delivery, requeue)
}
}