use std::sync::Arc;
use rust_dix::ScopeFactory;
use super::dispatch;
use super::{IEventRequest, IMediator, IRequest};
use crate::error::Result;
use crate::handler::IEventHandler;
pub struct Mediator {
provider: Arc<rust_dix::ServiceProvider>,
}
impl Mediator {
pub fn new(provider: Arc<rust_dix::ServiceProvider>) -> Self {
Self { provider }
}
}
#[async_trait::async_trait]
impl IMediator for Mediator {
async fn send<T, R>(&self, req: T) -> Result<R>
where
T: IRequest<R> + Send + 'static,
R: serde::Serialize + Send + 'static,
{
dispatch::dispatch(&self.provider, req).await
}
async fn publish<T: IEventRequest>(&self, event: T) -> Result<()> {
let scope = self.provider.create_scope();
let handlers: Vec<Arc<dyn IEventHandler<T>>> = scope.get_all::<dyn IEventHandler<T>>();
for handler in handlers {
handler.handle(event.clone()).await?;
}
Ok(())
}
}