use crate::{JournalEntry, JournalError, JournalHead, JournalObject, Lease, StoredDatumRef};
use sim_kernel::{ContentId, Datum};
use std::collections::BTreeMap;
use std::sync::Arc;
#[derive(Clone, Debug, Default)]
pub struct StoredState {
pub objects: BTreeMap<ContentId, Vec<u8>>,
pub datums: BTreeMap<ContentId, Datum>,
pub entries: BTreeMap<u64, JournalEntry>,
pub head: Option<JournalHead>,
}
pub struct Admission {
pub fence: u64,
pub expected: Option<JournalHead>,
pub objects: Vec<JournalObject>,
pub entries: Vec<JournalEntry>,
}
pub trait JournalBackend: Send + Sync {
fn acquire_lease(&self) -> Result<Lease, JournalError>;
fn read_state(&self) -> Result<StoredState, JournalError>;
fn admit(&self, admission: Admission) -> Result<JournalHead, JournalError>;
fn put_datum(&self, object: JournalObject) -> Result<StoredDatumRef, JournalError>;
fn get_datum(&self, meaning: &ContentId) -> Result<Datum, JournalError>;
fn rebuild_datum_index(&self) -> Result<Vec<StoredDatumRef>, JournalError>;
}
impl<T: JournalBackend + ?Sized> JournalBackend for Arc<T> {
fn acquire_lease(&self) -> Result<Lease, JournalError> {
(**self).acquire_lease()
}
fn read_state(&self) -> Result<StoredState, JournalError> {
(**self).read_state()
}
fn admit(&self, admission: Admission) -> Result<JournalHead, JournalError> {
(**self).admit(admission)
}
fn put_datum(&self, object: JournalObject) -> Result<StoredDatumRef, JournalError> {
(**self).put_datum(object)
}
fn get_datum(&self, meaning: &ContentId) -> Result<Datum, JournalError> {
(**self).get_datum(meaning)
}
fn rebuild_datum_index(&self) -> Result<Vec<StoredDatumRef>, JournalError> {
(**self).rebuild_datum_index()
}
}