pub use crate::ais::AisEvent;
pub use crate::buddy::BuddyEvent;
use crate::Result;
use derive_more::From;
use std::sync::Arc;
use tokio::sync::broadcast::{self, Receiver, Sender};
#[derive(Debug, Clone, From)]
pub enum Event {
Ais(AisEvent),
Buddy(BuddyEvent),
}
#[derive(Debug, Clone)]
pub struct EventBus {
tx: Sender<Event>,
_rx: Arc<Receiver<Event>>,
}
impl EventBus {
#[allow(clippy::new_without_default)]
pub fn new() -> EventBus {
let (tx, rx) = broadcast::channel::<Event>(16);
EventBus {
tx,
_rx: Arc::new(rx),
}
}
pub(crate) fn send(&self, evt: impl Into<Event>) -> Result<()> {
let evt = evt.into();
self.tx.send(evt)?;
Ok(())
}
pub fn subscribe(&self) -> Result<Receiver<Event>> {
Ok(self.tx.subscribe())
}
}