use {
crate::{
Event, PublisherFactory,
backend::{self},
stream_name::StreamName,
stream_policy::StreamPolicy,
},
std::path::Path,
thiserror::Error,
};
#[derive(Clone)]
pub struct EventSystem {
backend: Backend,
}
#[derive(Clone)]
enum Backend {
Platform(backend::EventSystem),
Stub(backend::stub::EventSystem),
}
impl EventSystem {
pub fn new(event_system_directory: impl AsRef<Path>) -> Result<Self, CreateEventSystemError> {
Ok(Self {
backend: Backend::Platform(backend::EventSystem::new(event_system_directory)?),
})
}
pub fn stub() -> Self {
Self {
backend: Backend::Stub(backend::stub::EventSystem),
}
}
pub fn create_stream<E: Event>(
&self,
stream_name: StreamName,
stream_config: StreamConfig,
) -> Result<PublisherFactory<E>, CreateStreamError> {
match &self.backend {
Backend::Platform(backend) => backend
.create_stream::<E>(stream_name, stream_config)
.map(PublisherFactory::new),
Backend::Stub(backend) => backend
.create_stream::<E>(stream_name, stream_config)
.map(PublisherFactory::stub),
}
}
pub fn set_stream_policy(&self, stream_policy: StreamPolicy) {
match &self.backend {
Backend::Platform(backend) => backend.set_stream_policy(stream_policy),
Backend::Stub(backend) => backend.set_stream_policy(stream_policy),
}
}
}
impl std::fmt::Debug for EventSystem {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self.backend {
Backend::Platform(backend) => backend.fmt(formatter),
Backend::Stub(backend) => backend.fmt(formatter),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StreamConfig {
pub capacity: usize,
pub publisher_slots: usize,
pub subscriber_slots: usize,
}
#[derive(Debug, Error)]
#[error("failed to create the event-system directory")]
pub struct CreateEventSystemError(#[from] std::io::Error);
#[derive(Debug, Error)]
#[error("{0}")]
pub struct EventQueueError(#[source] pub(crate) backend::EventQueueError);
#[derive(Debug, Error)]
pub enum CreateStreamError {
#[error("failed to serialize the event-stream schema")]
FailedToSerializeSchema(#[source] wincode::WriteError),
#[error("failed to create the event-stream files")]
FileSystem(#[from] std::io::Error),
#[error("the stream name is already in use")]
StreamNameAlreadyInUse,
#[error("failed to create the event-stream queue")]
Queue(#[source] EventQueueError),
#[error("failed to produce a random number for the queue identifier")]
OsRngFailure(std::io::Error),
}