bytebuilder 0.3.0

A simple binary serializer/deserializer
Documentation
use crate::{bits::{get_bit, set_bit}, builder::ByteBuilder, traits::Builder};

pub struct BitBuilder {
    pub bytes: Vec<u8>,
    pub bit_offset: usize,
}

impl BitBuilder {
    pub fn new() -> Self {
        Self {
            bytes: Vec::new(),
            bit_offset: 0,
        }
    }
    pub fn with_capacity(capacity: usize) -> Self {
        Self {
            bytes: Vec::with_capacity(capacity),
            bit_offset: 0,
        }
    }
    pub fn from_bytes(bytes: Vec<u8>) -> Self {
        Self {
            bytes,
            bit_offset: 0, // Start at byte boundary
        }
    }

    pub fn push_bit(&mut self, value: bool) {
        if self.bytes.is_empty() {
            self.bytes.push(0);
            self.bit_offset = 0;
        } else if self.bit_offset == 8 {
            self.bytes.push(0);
            self.bit_offset = 0;
        }

        set_bit(&mut self.bytes.last_mut().unwrap(), self.bit_offset, value);

        self.bit_offset += 1;
    }
}

impl Builder for BitBuilder {
    fn push_u8(&mut self, value: u8) {
        for i in 0..8 {
            let bit = get_bit(value, i);
            self.push_bit(bit);
        }
    }

    fn as_slice(&self) -> &[u8] {
        &self.bytes
    }

    fn build(self) -> Vec<u8> {
        self.bytes
    }
}

impl From<ByteBuilder> for BitBuilder {
    fn from(builder: ByteBuilder) -> Self {
        BitBuilder {
            bytes: builder.bytes,
            bit_offset: 0,
        }
    }
}