use std::fmt;
use std::sync::Arc;
use super::block::{Block, Compare};
use super::handle::{BlockHandle, read_block, unseal};
use crate::error::{Error, Result};
use crate::seal::FileSealer;
pub trait BlockSource: Send + Sync + fmt::Debug {
fn block(&self, handle: BlockHandle) -> Result<Option<Block>>;
}
pub fn unseal_block(
sealed: &[u8],
at: u64,
sealer: Option<&FileSealer>,
compare: Compare,
) -> Result<Block> {
Block::new(unseal(sealed, at, sealer)?, compare)
}
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum OpenError<E> {
#[error(transparent)]
Format(Error),
#[error("reading the table failed")]
Read(E),
}
#[derive(Debug)]
pub(super) struct Resident {
pub(super) file: Arc<[u8]>,
pub(super) compare: Compare,
pub(super) sealer: Option<Arc<FileSealer>>,
}
impl BlockSource for Resident {
fn block(&self, handle: BlockHandle) -> Result<Option<Block>> {
Block::new(
read_block(&self.file, handle, self.sealer.as_deref())?,
self.compare,
)
.map(Some)
}
}