use super::{BlockHandle, BlockOffset};
use crate::sfa::TocEntry;
fn toc_entry_to_handle(entry: &TocEntry) -> crate::Result<BlockHandle> {
let size: u32 = entry
.len()
.try_into()
.map_err(|_| crate::Error::InvalidHeader("Toc"))?;
Ok(BlockHandle::new(BlockOffset(entry.pos()), size))
}
#[derive(Copy, Clone, Debug, Default)]
pub struct ParsedRegions {
pub tli: BlockHandle,
pub tli_tail: Option<BlockHandle>,
pub index: Option<BlockHandle>,
pub filter_tli: Option<BlockHandle>,
pub filter: Option<BlockHandle>,
pub range_tombstones: Option<BlockHandle>,
pub block_layout: Option<BlockHandle>,
pub locator: Option<BlockHandle>,
pub seqno_bounds: Option<BlockHandle>,
pub zone_map: Option<BlockHandle>,
pub delete_bitmap: Option<BlockHandle>,
pub linked_blob_files: Option<BlockHandle>,
pub metadata: BlockHandle,
pub metadata_mid: Option<BlockHandle>,
}
impl ParsedRegions {
pub fn parse_from_toc(toc: &crate::sfa::Toc) -> crate::Result<Self> {
Ok(Self {
filter_tli: toc
.section(b"filter_tli")
.map(toc_entry_to_handle)
.transpose()?,
tli: toc
.section(b"tli")
.map(toc_entry_to_handle)
.transpose()?
.ok_or_else(|| {
log::error!("TLI should exist");
crate::Error::Unrecoverable
})?,
tli_tail: toc
.section(b"tli_tail")
.map(toc_entry_to_handle)
.transpose()?,
index: toc.section(b"index").map(toc_entry_to_handle).transpose()?,
filter: toc
.section(b"filter")
.map(toc_entry_to_handle)
.transpose()?,
range_tombstones: toc
.section(b"range_tombstones")
.map(toc_entry_to_handle)
.transpose()?,
block_layout: toc
.section(b"block_layout")
.map(toc_entry_to_handle)
.transpose()?,
locator: toc
.section(b"locator")
.map(toc_entry_to_handle)
.transpose()?,
seqno_bounds: toc
.section(b"seqno_bounds")
.map(toc_entry_to_handle)
.transpose()?,
zone_map: toc
.section(b"zone_map")
.map(toc_entry_to_handle)
.transpose()?,
delete_bitmap: toc
.section(b"delete_bitmap")
.map(toc_entry_to_handle)
.transpose()?,
linked_blob_files: toc
.section(b"linked_blob_files")
.map(toc_entry_to_handle)
.transpose()?,
metadata: toc
.section(b"meta")
.map(toc_entry_to_handle)
.transpose()?
.ok_or_else(|| {
log::error!("Metadata should exist");
crate::Error::Unrecoverable
})?,
metadata_mid: toc
.section(b"meta_mid")
.map(toc_entry_to_handle)
.transpose()?,
})
}
}