nostalgia 0.0.1

A simple wrapper for lmdb to allow for some syntactic sugar
Documentation
use crate::Record;
use lmdb::{Cursor, Transaction};

pub struct RoQuery<'txn, T> {
    pub phantom: std::marker::PhantomData<T>,
    pub db: lmdb::Database,
    pub txn: lmdb::RoTransaction<'txn>,
    pub iter: Option<lmdb::Iter<'txn>>,
}

impl<'txn, T: 'txn + Record> RoQuery<'txn, T> {
    pub fn new(db: lmdb::Database, txn: lmdb::RoTransaction<'txn>) -> RoQuery<'txn, T> {
        RoQuery {
            phantom: std::marker::PhantomData::<T>,
            db,
            txn,
            iter: None,
        }
    }
}

impl<'txn, T: 'txn + Record> Iterator for RoQuery<'txn, T> {
    type Item = T;

    fn next(&mut self) -> Option<Self::Item> {
        if self.iter.is_none() {
            let mut cursor = self.txn.open_ro_cursor(self.db).unwrap();
            self.iter = Some(cursor.iter());
        }

        if let Some(iter) = &mut self.iter {
            if let Some(record) = iter.next() {
                return match T::from_binary(record.1) {
                    Ok(record) => Some(record),
                    Err(_) => None,
                };
            }
        }

        None
    }
}