use crate::{
EventBusResult,
EventEnvelope,
PublishOptions,
StagedEvent,
StagedEventEnvelope,
Topic,
};
pub trait TransactionalPublisher {
fn publish<T>(&mut self, topic: &Topic<T>, payload: T) -> EventBusResult<()>
where
T: Clone + Send + Sync + 'static,
{
self.publish_envelope(EventEnvelope::create(topic.clone(), payload))
}
fn publish_envelope<T>(&mut self, envelope: EventEnvelope<T>) -> EventBusResult<()>
where
T: Clone + Send + Sync + 'static,
{
self.publish_envelope_with_options(envelope, PublishOptions::empty())
}
fn publish_envelope_with_options<T>(
&mut self,
envelope: EventEnvelope<T>,
options: PublishOptions<T>,
) -> EventBusResult<()>
where
T: Clone + Send + Sync + 'static,
{
self.publish_staged(Box::new(StagedEventEnvelope::new(envelope, options)))
}
fn publish_staged(&mut self, event: Box<dyn StagedEvent>) -> EventBusResult<()>;
fn publish_all_staged(&mut self, events: Vec<Box<dyn StagedEvent>>) -> EventBusResult<()> {
for event in events {
self.publish_staged(event)?;
}
Ok(())
}
fn commit(&mut self) -> EventBusResult<()>;
fn rollback(&mut self) -> EventBusResult<()>;
}