use bevy::prelude::*;
use std::collections::HashMap;
use crate::{
BusEvent, EventBusError,
backends::{EventBusBackendResource, EventBusBackendExt},
};
#[derive(bevy::ecs::system::SystemParam)]
pub struct EventBusWriter<'w, T: BusEvent + Event> {
backend: Option<Res<'w, EventBusBackendResource>>,
events: EventWriter<'w, T>,
}
impl<'w, T: BusEvent + Event> EventBusWriter<'w, T> {
pub fn send(&mut self, topic: &str, event: T) -> Result<(), EventBusError> {
if let Some(backend_res) = &self.backend {
let backend = backend_res.read();
backend.try_send(&event, topic)?;
}
self.events.write(event);
Ok(())
}
pub fn send_batch(
&mut self,
topic: &str,
events: impl IntoIterator<Item = T>,
) -> Result<(), EventBusError> {
let events: Vec<_> = events.into_iter().collect();
if let Some(backend_res) = &self.backend {
let backend = backend_res.read();
for event in &events {
backend.try_send(event, topic)?;
}
}
for event in events {
self.events.write(event);
}
Ok(())
}
pub fn send_with_headers(
&mut self,
topic: &str,
event: T,
headers: HashMap<String, String>
) -> Result<(), EventBusError> {
if let Some(backend_res) = &self.backend {
let backend = backend_res.read();
backend.try_send_with_headers(&event, topic, &headers)?;
}
self.events.write(event);
Ok(())
}
pub fn send_default(&mut self, topic: &str) -> Result<(), EventBusError>
where
T: Default,
{
self.send(topic, T::default())
}
}