use serde::{Deserialize, Serialize};
use tokio::sync::broadcast;
mod errors;
pub mod module;
pub use errors::{
EventReceiveError, EventReceiveResult, EventSendError, EventSendResult,
EventTryReceiveError, EventTryReceiveResult,
};
pub use module::{
AuthEvent, ConsoleOutputEvent, ConsoleStream, CoreEvent, InstanceDeletedEvent,
InstanceExitedEvent, InstanceLaunchedEvent, InstanceWindowAppearedEvent, JavaEvent,
LaunchEvent, LoaderEvent, ModloaderEvent,
};
#[derive(Clone)]
pub struct EventBus {
sender: broadcast::Sender<Event>,
}
impl EventBus {
pub fn new(capacity: usize) -> Self {
let (sender, _) = broadcast::channel(capacity);
Self { sender }
}
pub fn subscribe(&self) -> EventReceiver {
EventReceiver {
receiver: self.sender.subscribe(),
}
}
pub fn emit(&self, event: Event) {
let _ = self.sender.send(event);
}
}
pub struct EventReceiver {
receiver: broadcast::Receiver<Event>,
}
impl EventReceiver {
pub async fn next(&mut self) -> EventReceiveResult<Event> {
self.receiver.recv().await.map_err(Into::into)
}
pub fn try_next(&mut self) -> EventTryReceiveResult<Event> {
self.receiver.try_recv().map_err(Into::into)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "data")]
pub enum Event {
Auth(AuthEvent),
Java(JavaEvent),
Launch(LaunchEvent),
Loader(LoaderEvent),
Modloader(ModloaderEvent),
Core(CoreEvent),
InstanceLaunched(InstanceLaunchedEvent),
InstanceWindowAppeared(InstanceWindowAppearedEvent),
InstanceExited(InstanceExitedEvent),
ConsoleOutput(ConsoleOutputEvent),
InstanceDeleted(InstanceDeletedEvent),
}
use once_cell::sync::Lazy;
pub static EVENT_BUS: Lazy<EventBus> = Lazy::new(|| EventBus::new(1000));