use std::future::Future;
use crate::entity::Entity;
use crate::repository::{RepositoryError, StreamIdentity};
use super::{
AttemptFence, CausalCommitBatch, CausalStorageIdentity, CommandLedgerError, CommandLedgerKey,
CommandLookup, CommandLookupScope, CommandReservation, ReservationOutcome,
};
pub(crate) trait CausalGetStream: Send + Sync {
fn get_causal_stream<'a>(
&'a self,
identity: &'a StreamIdentity,
) -> impl Future<Output = Result<Option<Entity>, RepositoryError>> + Send + 'a;
}
pub(crate) trait CausalRepositoryIdentity: Send + Sync {
fn causal_storage_identity(&self) -> CausalStorageIdentity;
}
pub(crate) trait CommandLedgerStore: Send + Sync {
fn reserve_command(
&self,
reservation: CommandReservation,
) -> impl Future<Output = Result<ReservationOutcome, CommandLedgerError>> + Send + '_;
fn lookup_command<'a>(
&'a self,
key: &'a CommandLedgerKey,
scope: CommandLookupScope<'a>,
) -> impl Future<Output = Result<CommandLookup, CommandLedgerError>> + Send + 'a;
fn mark_retryable_unknown(
&self,
attempt: AttemptFence,
) -> impl Future<Output = Result<(), CommandLedgerError>> + Send + '_;
#[allow(dead_code)]
fn compact_expired_commands(
&self,
limit: usize,
) -> impl Future<Output = Result<u64, CommandLedgerError>> + Send + '_;
}
pub(crate) trait CausalTransactionalCommit: Send + Sync {
fn commit_causal_batch<'a>(
&'a self,
batch: CausalCommitBatch<'a>,
) -> impl Future<Output = Result<(), CommandLedgerError>> + Send + 'a;
}