use std::sync::Arc;
use crate::handler::{HandlerMiddleware, MessageHandler, chain_handlers};
pub struct StackBuilder<T: Send + Sync + Clone + 'static> {
base: Arc<dyn MessageHandler<T>>,
middlewares: Vec<Arc<dyn HandlerMiddleware<T>>>,
}
impl<T: Send + Sync + Clone + 'static> StackBuilder<T> {
pub fn new(base: Arc<dyn MessageHandler<T>>) -> Self {
Self {
base,
middlewares: Vec::new(),
}
}
#[must_use]
pub fn with<M: HandlerMiddleware<T> + 'static>(mut self, mw: M) -> Self {
self.middlewares.push(Arc::new(mw));
self
}
pub fn build(self) -> Arc<dyn MessageHandler<T>> {
chain_handlers(self.base, &self.middlewares)
}
}