use crate::{Error, Event, EventBus, Result};
use std::sync::OnceLock;
static GLOBAL_BUS: OnceLock<EventBus> = OnceLock::new();
#[allow(clippy::result_large_err)]
pub fn set_global_bus(bus: EventBus) -> std::result::Result<(), EventBus> {
GLOBAL_BUS.set(bus)
}
pub fn get_bus() -> Option<&'static EventBus> {
GLOBAL_BUS.get()
}
pub async fn publish<E: Event>(event: E) -> Result<uuid::Uuid> {
if let Some(bus) = GLOBAL_BUS.get() {
bus.publish(event).await
} else {
Err(Error::internal("Global event bus not initialized. Call tokio_events::global::set_global_bus() first."))
}
}
pub async fn shutdown() -> Result<()> {
if let Some(bus) = GLOBAL_BUS.get() {
bus.shutdown().await
} else {
Err(Error::internal("Global event bus not initialized."))
}
}
pub async fn shutdown_gracefully() -> Result<()> {
if let Some(bus) = GLOBAL_BUS.get() {
bus.shutdown_gracefully().await
} else {
Err(Error::internal("Global event bus not initialized."))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::EventBusBuilder;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
struct GlobalTestEvent {
id: u32,
}
impl Event for GlobalTestEvent {
fn event_type() -> &'static str {
"GlobalTestEvent"
}
}
#[tokio::test]
async fn test_global_bus() {
let bus = EventBusBuilder::new().build().await.unwrap();
let _ = set_global_bus(bus);
assert!(get_bus().is_some());
let res = publish(GlobalTestEvent { id: 42 }).await;
assert!(res.is_ok());
}
}