use async_trait::async_trait;
use std::sync::Arc;
use crate::error::WorkerResult;
use crate::message::ReceivedMessage;
pub mod ack_nack;
#[cfg(feature = "rate-limit")]
pub mod rate_limit;
pub mod circuit_breaker;
pub mod tracing;
pub mod retry_handler;
pub mod batch;
pub mod processing_timeout;
#[async_trait]
pub trait MessageHandler: Send + Sync {
async fn handle(&self, message: ReceivedMessage<serde_json::Value>) -> WorkerResult<()>;
}
#[async_trait]
pub trait Middleware: Send + Sync {
fn name(&self) -> &str;
async fn handle(
&self,
message: ReceivedMessage<serde_json::Value>,
next: Box<dyn MessageHandler>,
) -> WorkerResult<()>;
}
pub struct MiddlewareChain {
middlewares: Vec<Box<dyn Middleware>>,
final_handler: Box<dyn MessageHandler>,
}
impl MiddlewareChain {
pub fn new(
middlewares: Vec<Box<dyn Middleware>>,
final_handler: Box<dyn MessageHandler>,
) -> Self {
Self {
middlewares,
final_handler,
}
}
pub fn build(self) -> Box<dyn MessageHandler> {
let mut handler: Arc<dyn MessageHandler> = Arc::new(ArcHandlerWrapper(self.final_handler));
for middleware in self.middlewares.into_iter().rev() {
handler = Arc::new(MiddlewareWrapper {
middleware,
inner: handler,
});
}
Box::new(ArcHandler(handler))
}
}
struct MiddlewareWrapper {
middleware: Box<dyn Middleware>,
inner: Arc<dyn MessageHandler>,
}
#[async_trait]
impl MessageHandler for MiddlewareWrapper {
async fn handle(&self, message: ReceivedMessage<serde_json::Value>) -> WorkerResult<()> {
let next = self.inner.clone();
self.middleware.handle(message, Box::new(ArcHandler(next))).await
}
}
struct ArcHandler(Arc<dyn MessageHandler>);
#[async_trait]
impl MessageHandler for ArcHandler {
async fn handle(&self, message: ReceivedMessage<serde_json::Value>) -> WorkerResult<()> {
self.0.handle(message).await
}
}
struct ArcHandlerWrapper(Box<dyn MessageHandler>);
#[async_trait]
impl MessageHandler for ArcHandlerWrapper {
async fn handle(&self, message: ReceivedMessage<serde_json::Value>) -> WorkerResult<()> {
self.0.handle(message).await
}
}