+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()
+ }
+ }
+}