mc-network-data-types 0.1.4

Minecraft network I/O data types
Documentation
use std::io::Result;
use std::{io::Write, io::Read};
use crate::encoding::{Encoder, Decoder};
use crate::var_int::{VarIntRead, VarIntWrite};

pub trait VarIntSizedVecRead<D>: Sized {
    fn read_var_int_sized_vec(&mut self) -> Result<Vec<D>>;
}

pub trait VarIntSizedVecWrite {
    fn write_var_int_sized_vec<E: Encoder>(&mut self, vec: &Vec<E>) -> Result<()>;
}

impl<W> VarIntSizedVecWrite for W
where
    W: Write,
{
    fn write_var_int_sized_vec<E: Encoder>(&mut self, vec: &Vec<E>) -> Result<()> {
        self.write_var_i32(vec.len() as i32)?;
        for ele in vec {
            ele.encode_to_write(self)?;
        }
        Ok(())
    }
}

impl<D, R> VarIntSizedVecRead<D> for R
where
    R: Read,
    D: Decoder,
{
    fn read_var_int_sized_vec(&mut self) -> Result<Vec<D>> {
        let len = self.read_var_i32()?;
        let mut buf = Vec::<D>::with_capacity(len as usize);
        for _ in 0..len {
            let ele = D::decode_from_read(self)?;
            buf.push(ele);
        }
        Ok(buf)
    }
}