use std::env;
use eventsourcingdb::{Client, container::Container};
use crate::{EventSchema, Store};
#[cfg(test)]
mod tests;
const IMAGE_TAG_VARIABLE: &str = "EVENTSOURCINGDB_IMAGE_TAG";
#[derive(Debug)]
pub struct Database {
container: Container,
}
impl Database {
pub async fn isolated() -> Self {
let mut builder = Container::builder();
if let Ok(image_tag) = env::var(IMAGE_TAG_VARIABLE) {
builder = builder.with_image_tag(&image_tag);
}
match builder.start().await {
Ok(container) => Self { container },
Err(error) => panic!("starting a database: {error}"),
}
}
pub async fn client(&self) -> Client {
match self.container.get_client().await {
Ok(client) => client,
Err(error) => panic!("connecting to the database: {error}"),
}
}
pub async fn store(
&self,
source: impl Into<String>,
schemas: impl IntoIterator<Item = EventSchema>,
) -> Store {
let store = Store::builder(self.client().await, source).build();
if let Err(failure) = store.register_schemas(schemas).await {
panic!("registering the schemas: {failure}");
}
store
}
}