bdat 0.5.0-alpha

(De)serialization library for Monolithsoft's BDAT file format
Documentation
use std::ops::AddAssign;

pub enum CompatIter<M, L> {
    Modern(M),
    Legacy(L),
}

pub struct RowIdIter<I, N> {
    iter: I,
    id: N,
}

pub(crate) trait EnumId
where
    Self: Sized,
{
    fn enum_id<N>(self, base_id: N) -> RowIdIter<Self, N>;
}

impl<I, N, It> Iterator for RowIdIter<I, N>
where
    I: Iterator<Item = It>,
    N: Copy + AddAssign + From<u8>,
{
    type Item = (N, It);

    fn next(&mut self) -> Option<Self::Item> {
        let item = self.iter.next()?;
        let id = self.id;
        self.id += N::from(1);
        Some((id, item))
    }
}

impl<M, L, I> Iterator for CompatIter<M, L>
where
    M: Iterator<Item = I>,
    L: Iterator<Item = I>,
{
    type Item = I;

    fn next(&mut self) -> Option<Self::Item> {
        match self {
            CompatIter::Modern(m) => m.next(),
            CompatIter::Legacy(l) => l.next(),
        }
    }
}

impl<I, It> EnumId for I
where
    I: Iterator<Item = It>,
{
    fn enum_id<N>(self, base_id: N) -> RowIdIter<Self, N> {
        RowIdIter {
            iter: self,
            id: base_id,
        }
    }
}