]> git.mikk.net Git - mtbl-rs/commitdiff
experimental first cut at reader -- not working
authorChris Mikkelson <cmikk@fsi.io>
Tue, 6 Aug 2024 01:38:49 +0000 (19:38 -0600)
committerChris Mikkelson <cmikk@fsi.io>
Tue, 6 Aug 2024 01:38:49 +0000 (19:38 -0600)
src/reader/mod.rs

index ee482110dc3b7852424563ac9144fe1e24f6d0d4..2496992e4dea7bd25b0e8ef8b1da7ad1d74f1df3 100644 (file)
@@ -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<block::Block<'r>>,
+    next_offset: usize,
+    data_iter: Option<block::BlockIter<'r>>,
+}
+
+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<Self::Item> {
+        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()
+        }
+    }
+}