use std::{ops::RangeBounds, sync::Arc, vec::Vec};
use crate::{
block, operation,
operation::{GroupId, OperationId},
};
pub mod error;
use bytes::Bytes;
pub use error::Error;
#[cfg(feature = "memory-pending")]
pub mod memory;
pub trait PendingStore: Send + Sync + 'static {
fn put_operation(&mut self, operation: operation::NewOperation) -> Result<bool, Error>;
fn update_operation_commit_status(
&mut self,
operation_id: OperationId,
status: CommitStatus,
) -> Result<(), Error>;
fn get_operation(&self, operation_id: OperationId) -> Result<Option<StoredOperation>, Error>;
fn get_group_operations(
&self,
group_id: GroupId,
) -> Result<Option<StoredOperationsGroup>, Error>;
fn operations_iter<R>(&self, range: R) -> Result<TimelineIterator, Error>
where
R: RangeBounds<OperationId>;
fn operations_count(&self) -> usize;
fn delete_operation(&mut self, operation_id: OperationId) -> Result<(), Error>;
}
pub type TimelineIterator<'store> = Box<dyn Iterator<Item = StoredOperation> + 'store>;
#[derive(Clone)]
pub struct StoredOperation {
pub group_id: GroupId,
pub operation_id: OperationId,
pub operation_type: operation::OperationType,
pub commit_status: CommitStatus,
pub frame: Arc<operation::OperationFrame<Bytes>>,
}
pub struct StoredOperationsGroup {
pub group_id: GroupId,
pub operations: Vec<StoredOperation>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CommitStatus {
Unknown,
Committed(block::BlockOffset, block::BlockHeight),
}