use async_trait::async_trait;
pub struct Message(lapin::message::Delivery);
pub enum MessageError {
Drop,
Reject,
Nack,
}
impl Message {
#[inline]
pub fn new(delivery: lapin::message::Delivery) -> Self {
Self(delivery)
}
#[inline]
pub fn data(&self) -> &[u8] {
&self.0.data
}
#[inline]
pub fn delivery_tag(&self) -> u64 {
self.0.delivery_tag
}
#[inline]
pub fn reply_to(&self) -> Option<&str> {
self.0
.properties
.reply_to()
.as_ref()
.map(|str| str.as_str())
}
}
#[async_trait]
pub trait MessagePeek {
async fn peek(&mut self, msg: &Message) -> Result<(), MessageError>;
fn boxed_clone(&self) -> Box<dyn MessagePeek + Send + Sync>;
}
impl Clone for Box<dyn MessagePeek + Send + Sync> {
fn clone(&self) -> Box<dyn MessagePeek + Send + Sync> {
self.boxed_clone()
}
}
#[async_trait]
pub trait MessageProcess {
async fn process(&mut self, msg: &Message) -> Result<Vec<u8>, MessageError>;
fn boxed_clone(&self) -> Box<dyn MessageProcess + Send + Sync>;
}
impl Clone for Box<dyn MessageProcess + Send + Sync> {
fn clone(&self) -> Box<dyn MessageProcess + Send + Sync> {
self.boxed_clone()
}
}
#[derive(Clone)]
pub struct NoopPeeker;
#[async_trait]
impl MessagePeek for NoopPeeker {
async fn peek(&mut self, _msg: &Message) -> Result<(), MessageError> {
Ok(())
}
fn boxed_clone(&self) -> Box<dyn MessagePeek + Send + Sync> {
Box::new((*self).clone())
}
}
#[derive(Clone)]
struct RejectPeeker;
#[async_trait]
impl MessagePeek for RejectPeeker {
async fn peek(&mut self, _msg: &Message) -> Result<(), MessageError> {
Err(MessageError::Reject)
}
fn boxed_clone(&self) -> Box<dyn MessagePeek + Send + Sync> {
Box::new((*self).clone())
}
}
#[derive(Clone)]
pub struct EchoProcessor;
#[async_trait]
impl MessageProcess for EchoProcessor {
async fn process(&mut self, msg: &Message) -> Result<Vec<u8>, MessageError> {
Ok(msg.data().to_vec())
}
fn boxed_clone(&self) -> Box<dyn MessageProcess + Send + Sync> {
Box::new((*self).clone())
}
}