bin_codec 0.1.0

binary encoder decoder with bit field
Documentation
use crate::error;
pub trait EncodeBe {
    fn encode<T>(&self, target: &mut [u8], ctx: &mut T) {
        assert!(target.len() >= (self.bits() + 7) / 8);
        Self::encode_offset(self, target, ctx, &mut 0, self.bits());
    }
    fn encode_offset<T>(&self, target: &mut [u8], ctx: &mut T, offset: &mut usize, bits: usize);
    fn bits(&self) -> usize {
        Self::bits_with_user_define(self, None)
    }
    fn bits_with_user_define(&self, bits: Option<usize>) -> usize;
}

pub trait EncodeLe {
    fn encode<T>(&self, target: &mut [u8], ctx: &mut T) {
        assert!(target.len() >= (self.bits() + 7) / 8);
        Self::encode_offset(self, target, ctx, &mut 0, self.bits());
    }
    fn encode_offset<T>(&self, target: &mut [u8], ctx: &mut T, offset: &mut usize, bits: usize);
    fn bits(&self) -> usize {
        Self::bits_with_user_define(self, None)
    }
    fn bits_with_user_define(&self, bits: Option<usize>) -> usize;
}

pub enum ShouldDecode {
    HasNext(bool),
    Count(usize),
    IsSome(bool),
    None,
}

pub trait DecodeBe: Sized {
    type Context;
    fn decode(data: &[u8], ctx: &mut Self::Context) -> error::Result<(Self, usize)> {
        let mut offset = 0;
        Ok((Self::decode_offset(data, &mut offset, &mut ShouldDecode::None, ctx, 0)?, offset))
    }
    fn decode_offset(data: &[u8], offset: &mut usize, sd: &mut ShouldDecode, ctx: &mut Self::Context, bits: usize) -> error::Result<Self>;
    fn default_bits() -> usize;
}

pub trait DecodeLe: Sized {
    type Context;
    fn decode(data: &[u8], ctx: &mut Self::Context) -> error::Result<(Self, usize)> {
        let mut offset = 0;
        Ok((Self::decode_offset(data, &mut offset, &mut ShouldDecode::None, ctx, 0)?, offset))
    }
    fn decode_offset(data: &[u8], offset: &mut usize, sd: &mut ShouldDecode, ctx: &mut Self::Context, bits: usize) -> error::Result<Self>;
    fn default_bits() -> usize;
}