use {
crate::{Event, backend},
std::{fmt::Debug, marker::PhantomData, rc::Rc},
};
pub struct Publisher<E: Event> {
inner: backend::Publisher<E>,
_not_send_or_sync: PhantomData<Rc<()>>,
}
impl<E: Event> Publisher<E> {
pub fn publish(&mut self, event: &E) -> Result<(), PublishError> {
self.inner.publish(event)
}
pub fn publish_batch(&mut self, events: &[E]) -> Result<(), PublishError> {
self.inner.publish_batch(events)
}
pub(crate) fn new(inner: backend::Publisher<E>) -> Self {
Self {
inner,
_not_send_or_sync: PhantomData,
}
}
}
impl<E: Event> Debug for Publisher<E> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
Debug::fmt(&self.inner, f)
}
}
#[derive(thiserror::Error, Debug)]
pub enum PublishError {
#[error("Failed to serialize the event")]
Serialization(wincode::WriteError),
#[error("Failed to send the event. Back-pressured by event subscribers.")]
FailedToSend,
}