use std::sync::OnceLock;
use crate::Message;
static SUBSCRIBERS: OnceLock<Subscribers> = OnceLock::new();
pub trait Subscriber: Send + Sync {
fn on_message(&self, msg: &dyn Message);
}
#[derive(Default)]
pub struct Subscribers(Vec<Box<dyn Subscriber>>);
impl Subscribers {
fn dispatch(&self, msg: &dyn Message) {
for sub in &self.0 {
sub.on_message(msg);
}
}
pub fn install(self) -> Result<(), Subscribers> {
SUBSCRIBERS.set(self)
}
pub fn register(&mut self, subscriber: Box<dyn Subscriber>) {
self.0.push(subscriber);
}
}
pub(crate) fn dispatch(msg: &dyn Message) {
if let Some(subscribers) = SUBSCRIBERS.get() {
subscribers.dispatch(msg);
}
}