pub mod subscribers;
pub mod types;
use tokio::sync::broadcast;
pub use types::Event;
const CHANNEL_CAPACITY: usize = 256;
pub trait EventSubscriber: Send + Sync {
fn on_event(&self, event: &Event);
}
pub struct EventBus {
sender: broadcast::Sender<Event>,
subscribers: Vec<Box<dyn EventSubscriber + Send + Sync>>,
}
impl EventBus {
pub fn new() -> Self {
let (sender, _) = broadcast::channel(CHANNEL_CAPACITY);
Self {
sender,
subscribers: Vec::new(),
}
}
#[allow(dead_code)]
pub fn subscribe(&self) -> broadcast::Receiver<Event> {
self.sender.subscribe()
}
pub async fn emit(&self, event: Event) {
for sub in &self.subscribers {
sub.on_event(&event);
}
let _ = self.sender.send(event);
}
pub fn add_subscriber(&mut self, subscriber: Box<dyn EventSubscriber + Send + Sync>) {
self.subscribers.push(subscriber);
}
}
impl Default for EventBus {
fn default() -> Self {
Self::new()
}
}