arc-malachitebft-engine 0.7.0-pre

Implementation of the Malachite BFT consensus engine
Documentation
use std::io;
use std::marker::PhantomData;

use malachitebft_core_types::Context;
use malachitebft_wal as wal;

use eyre::Result;

use super::entry::decode_entry;
use super::{WalCodec, WalEntry};

pub fn log_entries<'a, Ctx, Codec>(
    log: &'a mut wal::Log,
    codec: &'a Codec,
) -> Result<WalIter<'a, Ctx, Codec>>
where
    Ctx: Context,
    Codec: WalCodec<Ctx>,
{
    Ok(WalIter {
        iter: log.iter()?,
        codec,
        _marker: PhantomData,
    })
}

pub struct WalIter<'a, Ctx, Codec> {
    iter: wal::LogIter<'a>,
    codec: &'a Codec,
    _marker: PhantomData<Ctx>,
}

impl<Ctx, Codec> Iterator for WalIter<'_, Ctx, Codec>
where
    Ctx: Context,
    Codec: WalCodec<Ctx>,
{
    type Item = io::Result<WalEntry<Ctx>>;

    fn next(&mut self) -> Option<Self::Item> {
        let entry = self.iter.next()?;
        match entry {
            Ok(bytes) => {
                let buf = io::Cursor::new(bytes);
                Some(decode_entry(self.codec, buf))
            }
            Err(e) => Some(Err(e)),
        }
    }
}