use std::{convert::Infallible, mem};
use async_trait::async_trait;
use lapin::{
acker::Acker as LapinAcker,
options::{BasicAckOptions, BasicRejectOptions},
};
use crate::{Extract, Request};
#[must_use = "You must call .ack or .reject in order to acknowledge or reject the message."]
#[derive(Debug)]
pub struct Acker(LapinAcker);
impl Acker {
pub async fn ack(self) -> Result<(), lapin::Error> {
self.0
.ack(BasicAckOptions {
multiple: false,
})
.await
}
pub async fn reject(self, options: BasicRejectOptions) -> Result<(), lapin::Error> {
self.0.reject(options).await
}
}
#[async_trait]
impl<S> Extract<S> for Acker
where
S: Send + Sync,
{
type Error = Infallible;
async fn extract(req: &mut Request<S>) -> Result<Self, Self::Error> {
let acker = mem::take(&mut req.delivery_mut().acker);
req.acked = true;
if acker == LapinAcker::default() {
panic!(
"extracted acker was equal to the default acker - did you extract an acker twice?"
);
}
Ok(Acker(acker))
}
}