pub trait Middleware: Send + Sync {
// Required methods
fn name(&self) -> &str;
fn handle<'life0, 'async_trait>(
&'life0 self,
message: ReceivedMessage<Value>,
next: Box<dyn MessageHandler>,
) -> Pin<Box<dyn Future<Output = Result<MiddlewareResult, WorkerError>> + Send + 'async_trait>>
where Self: 'async_trait,
'life0: 'async_trait;
}Expand description
Middleware that wraps message handlers to add cross-cutting concerns.
Middleware forms a chain where each piece can:
- Modify messages before passing them along
- Perform actions before and after processing
- Short-circuit the chain by returning early
- Handle errors and implement retry logic
- Signal whether acknowledgment was handled
§Example
use foxtive_worker::middleware::{Middleware, MessageHandler, MiddlewareResult};
use foxtive_worker::{ReceivedMessage, WorkerError};
struct LoggingMiddleware;
#[async_trait::async_trait]
impl Middleware for LoggingMiddleware {
fn name(&self) -> &str { "logging" }
async fn handle(
&self,
message: ReceivedMessage<serde_json::Value>,
next: Box<dyn MessageHandler>,
) -> Result<MiddlewareResult, WorkerError> {
println!("Processing message: {}", message.message.id);
let result = next.handle(message).await?;
println!("Message processed with result: {:?}", result);
Ok(result)
}
}Required Methods§
Sourcefn handle<'life0, 'async_trait>(
&'life0 self,
message: ReceivedMessage<Value>,
next: Box<dyn MessageHandler>,
) -> Pin<Box<dyn Future<Output = Result<MiddlewareResult, WorkerError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn handle<'life0, 'async_trait>(
&'life0 self,
message: ReceivedMessage<Value>,
next: Box<dyn MessageHandler>,
) -> Pin<Box<dyn Future<Output = Result<MiddlewareResult, WorkerError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Process a message with access to the next handler in the chain.
§Arguments
message- The message to processnext- The next handler in the middleware chain
§Returns
Ok(MiddlewareResult::Acknowledged)if middleware handled acknowledgmentOk(MiddlewareResult::Continue)if processing should continue normallyErr(WorkerError)if processing failed
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".