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::io::Read;

#[derive(Debug, Clone, Default)]
pub struct MCBitSet(Vec<bool>);

impl MCBitSet {
    pub fn push(&mut self, value: bool) {
        self.0.push(value)
    }
}

impl MCType for MCBitSet {
    fn pack(&self) -> Vec<u8> {
        let mut data = Vec::new();
        for long in self.0.chunks(64) {
            let mut num = 0_i64;
            for (bit_index, bit) in long.iter().enumerate() {
                num |= (*bit as i64) << bit_index;
            }
            data.extend(num.to_be_bytes());
        }
        let mut result = Vec::new();
        result.extend(MCVarInt::from((data.len() / 8) as i32).pack());
        result.extend(data);
        result
    }

    fn unpack(src: &mut dyn Read) -> Self {
        let len = MCVarInt::unpack(src);
        let mut result = Vec::new();
        for _ in 0..len.into() {
            let mut num = i64::from_be_bytes([
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
                src.read_byte(),
            ]);

            for _ in 0..64 {
                result.push((num & 0b1) == 1);
                num >>= 1;
            }
        }
        Self(result)
    }
}