use serde::Serialize;
use anvil_core::Container;
use bellows::BellowsServer;
pub trait SparkBroadcast: Serialize + Send + Sync {
fn channel(&self) -> String;
fn event_name(&self) -> String;
}
pub fn broadcast<E: SparkBroadcast>(c: &Container, event: E) {
let payload = serde_json::to_value(&event).unwrap_or(serde_json::Value::Null);
if let Some(server) = c.resolve::<BellowsServer>() {
server.publish(&event.channel(), &event.event_name(), payload);
} else {
tracing::debug!(
channel = %event.channel(),
event = %event.event_name(),
"spark::broadcast called but BellowsServer is not bound in the container"
);
}
}