use stateset_core::{
IngestOrder, MapPurgatoryLine, PurgatoryFilter, PurgatoryLineItemId, PurgatoryOrder,
PurgatoryOrderId, Result,
};
use stateset_db::{Database, DatabaseCapability};
use std::sync::Arc;
pub struct Purgatory {
db: Arc<dyn Database>,
}
impl std::fmt::Debug for Purgatory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Purgatory").finish_non_exhaustive()
}
}
impl Purgatory {
pub(crate) fn new(db: Arc<dyn Database>) -> Self {
Self { db }
}
#[must_use]
pub fn is_supported(&self) -> bool {
self.db.supports_capability(DatabaseCapability::Purgatory)
}
fn ensure(&self) -> Result<()> {
self.db.ensure_capability(DatabaseCapability::Purgatory)
}
pub fn ingest(&self, input: IngestOrder) -> Result<PurgatoryOrder> {
self.ensure()?;
self.db.purgatory().ingest(input)
}
pub fn get(&self, id: PurgatoryOrderId) -> Result<Option<PurgatoryOrder>> {
self.ensure()?;
self.db.purgatory().get(id)
}
pub fn list(&self, filter: PurgatoryFilter) -> Result<Vec<PurgatoryOrder>> {
self.ensure()?;
self.db.purgatory().list(filter)
}
pub fn map_line(
&self,
id: PurgatoryOrderId,
line_id: PurgatoryLineItemId,
input: MapPurgatoryLine,
) -> Result<PurgatoryOrder> {
self.ensure()?;
self.db.purgatory().map_line(id, line_id, input)
}
pub fn post(&self, id: PurgatoryOrderId) -> Result<PurgatoryOrder> {
self.ensure()?;
self.db.purgatory().post(id)
}
pub fn delete(&self, id: PurgatoryOrderId) -> Result<()> {
self.ensure()?;
self.db.purgatory().delete(id)
}
}