deku 0.13.1

bit level serialization/deserialization proc-macro for structs
Documentation
use deku::prelude::*;
use hexlit::hex;
use std::convert::TryFrom;

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(type = "u8")]
enum DekuTest {
    #[deku(id = "0")]
    Var1,
    #[deku(id = "1")]
    Var2(#[deku(bytes = "2")] u32),
    #[deku(id = "2")]
    Var3(u8, u8),
    #[deku(id = "3")]
    Var4 {
        field_a: u8,
        #[deku(count = "field_a")]
        field_b: Vec<u8>,
    },
    #[deku(id_pat = "4..=6")]
    Var5 { id: u8 },
    #[deku(id_pat = "&id if id > 6")]
    Var6 { id: u8 },
}

fn main() {
    let test_data = hex!("03020102").to_vec();

    let deku_test = DekuTest::try_from(test_data.as_ref()).unwrap();

    assert_eq!(
        DekuTest::Var4 {
            field_a: 0x02,
            field_b: vec![0x01, 0x02]
        },
        deku_test
    );

    let ret_out: Vec<u8> = deku_test.to_bytes().unwrap();

    assert_eq!(test_data, ret_out);

    let id_first_byte = deku_test.deku_id();
    assert_eq!(Ok(test_data[0]), id_first_byte);
}