deku 0.20.3

bit level serialization/deserialization proc-macro for structs
Documentation
use no_std_io::io::Cursor;

use deku::{prelude::*, reader::Reader};
use hexlit::hex;

const THREE: u8 = 3;

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(id_type = "u8")]
enum DekuTest {
    #[deku(id = 0)]
    Var1,

    #[deku(id = 1)]
    Var2(#[deku(bytes = 2)] u32),

    #[deku(id = 0x02)]
    Var3(u8, u8),

    #[deku(id = "THREE")]
    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 },

    #[deku(id_pat = "_")]
    VarDefault { id: u8, value: u8 },
}

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

    let mut cursor = Cursor::new(&test_data);
    let mut reader = Reader::new(&mut cursor);
    let deku_test = DekuTest::from_reader_with_ctx(&mut reader, ()).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);
}