bspparser 0.10.1

Parse Quake .bsp files
Documentation
use crate::Entry;
use binrw::{BinRead, BinResult};
use std::io::{Read, Seek, SeekFrom};

pub trait FromReader {
    type OutputType;
    fn element_count(size: u32) -> u32;
    fn from_reader<R: Read + Seek>(reader: &mut R) -> BinResult<Self::OutputType>;
}

impl<T: BinRead + for<'a> BinRead<Args<'a> = ()>> FromReader for T {
    type OutputType = T;

    fn element_count(size: u32) -> u32 {
        size / (size_of::<T>() as u32)
    }

    fn from_reader<R: Read + Seek>(reader: &mut R) -> BinResult<Self::OutputType> {
        T::read_le(reader)
    }
}

pub fn read_vec<T: FromReader>(
    reader: &mut (impl Read + Seek),
    entry: &Entry,
) -> BinResult<Vec<T::OutputType>> {
    reader.seek(SeekFrom::Start(entry.offset as u64))?;
    let count = T::element_count(entry.size);
    let mut elements = Vec::with_capacity(count as usize);
    for _ in 0..count {
        let element = T::from_reader(reader)?;
        elements.push(element);
    }
    Ok(elements)
}