mclib 0.0.1

Utils and helpers for Minecraft protocol
Documentation
use crate::types::base::MCType;
use crate::types::varint::MCVarInt;
use crate::utils::TcpUtils;
use std::fmt::Debug;
use std::io::{Cursor, Read};

#[derive(Debug, Clone)]
pub struct MCByteArray<T: MCType + Debug + Clone>(T);

impl<T: MCType + Debug + Clone> MCByteArray<T> {
    pub fn new(inner: T) -> Self {
        Self(inner)
    }
}

impl<T: MCType + Debug + Clone> MCType for MCByteArray<T> {
    fn pack(&self) -> Vec<u8> {
        let mut result = Vec::new();
        let body = self.0.pack();
        result.extend(MCVarInt::from(body.len() as i32).pack());
        result.extend(body);
        result
    }

    fn unpack(src: &mut dyn Read) -> Self {
        let length = MCVarInt::unpack(src);
        let mut buffer = Vec::new();
        for _ in 0..length.into() {
            buffer.push(src.read_byte());
        }
        let mut cursor = Cursor::new(buffer);
        let inner = T::unpack(&mut cursor);
        Self(inner)
    }
}