use std::any::Any;
use std::future::Future;
use crate::types::Event;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MiddlewareDecision {
Continue,
Reject(String),
}
pub trait Middleware: Send + Sync + 'static {
fn process<'a>(&'a self, event_name: &'static str, event: &'a (dyn Any + Send + Sync)) -> impl Future<Output = MiddlewareDecision> + Send + 'a;
}
pub trait SyncMiddleware: Send + Sync + 'static {
fn process(&self, event_name: &'static str, event: &(dyn Any + Send + Sync)) -> MiddlewareDecision;
}
pub trait TypedMiddleware<E: Event>: Send + Sync + 'static {
fn process<'a>(&'a self, event_name: &'static str, event: &'a E) -> impl Future<Output = MiddlewareDecision> + Send + 'a;
}
pub trait TypedSyncMiddleware<E: Event>: Send + Sync + 'static {
fn process(&self, event_name: &'static str, event: &E) -> MiddlewareDecision;
}