From: Chris Mikkelson Date: Tue, 6 Aug 2024 01:38:49 +0000 (-0600) Subject: experimental first cut at reader -- not working X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=fdbd929ff21085fd85432d229799989d23706fc0;p=mtbl-rs experimental first cut at reader -- not working --- diff --git a/src/reader/mod.rs b/src/reader/mod.rs index ee48211..2496992 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -1 +1,65 @@ +use crate::metadata::Metadata; +use crate::Entry; +use crate::Result; +use integer_encoding::VarInt; pub(crate) mod block; + +struct Reader<'r> { + data: &'r [u8], + index: block::Block<'r>, + metadata: Metadata, +} + +struct ReaderIter<'r> { + r: &'r Reader<'r>, + index_iter: block::BlockIter<'r>, + cur_data: Option>, + next_offset: usize, + data_iter: Option>, +} + +impl<'r> Reader<'r> { + pub fn iter(&'r self) -> ReaderIter<'r> { + let index_iter = self.index.iter(); + ReaderIter { + r: self, + index_iter, + next_offset: 0, + cur_data: None, + data_iter: None, + } + } +} + +impl<'r> ReaderIter<'r> { + fn load_block(&'r mut self) -> Result<()> { + let (size, len_size) = usize::decode_var(&self.r.data[self.next_offset..]).ok_or("")?; + let crc_off = self.next_offset + len_size; + let (_crc, len_crc) = u32::decode_var(&self.r.data[crc_off..]).ok_or("")?; + let data_off = crc_off + len_crc; + self.next_offset += data_off + size; + self.cur_data + .replace(block::Block::new(&self.r.data[data_off..data_off + size])?); + for b in self.cur_data.iter() { + self.data_iter.replace(b.iter()); + } + Ok(()) + } +} + +impl<'r> Iterator for &'r mut ReaderIter<'r> { + type Item = Entry; + fn next(&mut self) -> Option { + if self.cur_data.is_none() { + self.load_block().ok()?; + } + if let Some(e) = self.data_iter.as_mut().unwrap().next() { + Some(e) + } else if self.next_offset == self.r.data.len() { + None + } else { + self.load_block().ok()?; + self.data_iter.as_mut().unwrap().next() + } + } +}