pub type RangedFuture<'a, T> =
core::pin::Pin<Box<dyn core::future::Future<Output = Result<T, RangedStoreError>> + Send + 'a>>;
#[derive(Debug, thiserror::Error)]
pub enum RangedStoreError {
#[error("range alignment")]
Alignment(#[from] crate::RangeVerifyError),
#[error("blob is incomplete: cannot finalize")]
Incomplete,
#[error("backend")]
Backend(#[source] Box<dyn std::error::Error + Send + Sync>),
}
pub trait RangedStore: Send + Sync {
fn total_bytes(&self) -> u64;
fn present_ranges(&self) -> RangedFuture<'_, bao_tree::ChunkRanges>;
fn missing_ranges(
&self,
byte_offset: u64,
byte_len: u64,
) -> RangedFuture<'_, bao_tree::ChunkRanges>;
fn admit(&self, range: crate::AlignedRange, bao_bytes: bytes::Bytes) -> RangedFuture<'_, ()>;
fn read(&self, byte_offset: u64, byte_len: u64) -> RangedFuture<'_, bytes::Bytes>;
fn is_complete(&self) -> RangedFuture<'_, bool>;
fn finalize(&self) -> RangedFuture<'_, ()>;
}
#[cfg(test)]
mod tests;