binrw 0.15.1

A Rust crate for helping read structs from binary data using ✨macro magic✨
Documentation
use binrw::{io::Cursor, BinRead, BinWrite, BinWriterExt, Endian};

#[derive(BinWrite)]
struct Test {
    x: u8,
    y: u16,
    z: u32,
}

#[test]
fn simple_write() {
    let mut x = Cursor::new(Vec::new());

    Test { x: 1, y: 2, z: 3 }
        .write_options(&mut x, Endian::Big, ())
        .unwrap();

    assert_eq!(x.into_inner(), [1, 0, 2, 0, 0, 0, 3]);
}

use binrw::BinReaderExt;

#[derive(BinRead, BinWrite, Debug, PartialEq)]
struct TestRoundTrip {
    x: u16,

    #[brw(little)]
    y: u16,

    #[brw(is_big = true)]
    z: u32,

    #[brw(is_big = false)]
    not_z: u32,
}

#[derive(BinRead, BinWrite, Debug, PartialEq)]
struct TestRoundTripConjugate {
    x: u16,

    #[brw(little)]
    y: u16,

    #[brw(is_big = true)]
    z: u32,

    #[brw(is_big = false)]
    not_z: u32,

    empty: (),
}

#[test]
fn round_trip() {
    let bytes = &[0, 1, 2, 0, 0, 0, 0, 3, 3, 0, 0, 0];

    let mut reader = Cursor::new(bytes);

    let test: TestRoundTrip = reader.read_be().unwrap();

    let mut x = Cursor::new(Vec::new());

    x.write_be(&test).unwrap();

    assert_eq!(x.into_inner(), bytes);
}

#[test]
fn round_trip_2() {
    let bytes = &[0, 1, 2, 0, 0, 0, 0, 3, 3, 0, 0, 0];
    let mut reader = Cursor::new(bytes);
    let test: TestRoundTrip = reader.read_be().unwrap();

    let bytes_conj = &[0, 1, 2, 0, 0, 0, 0, 3, 3, 0, 0, 0];
    let mut reader_conj = Cursor::new(bytes_conj);
    let conj: TestRoundTripConjugate = reader_conj.read_be().unwrap();

    let mut x = Cursor::new(Vec::new());
    let mut y = Cursor::new(Vec::new());

    test.write_options(&mut x, Endian::Big, ()).unwrap();
    conj.write_options(&mut y, Endian::Big, ()).unwrap();

    assert_eq!(x.into_inner() == bytes, y.into_inner() == bytes_conj);
}