binrw 0.15.1

A Rust crate for helping read structs from binary data using ✨macro magic✨
Documentation
use binrw::{
    binwrite,
    io::{Cursor, Seek, SeekFrom, Write},
    BinWrite,
};

#[test]
fn writer_var() {
    struct Checksum<T> {
        inner: T,
        check: core::num::Wrapping<u8>,
    }

    impl<T> Checksum<T> {
        fn new(inner: T) -> Self {
            Self {
                inner,
                check: core::num::Wrapping(0),
            }
        }

        fn check(&self) -> u8 {
            self.check.0
        }
    }

    impl<T: Write> Write for Checksum<T> {
        fn write(&mut self, buf: &[u8]) -> binrw::io::Result<usize> {
            for b in buf {
                self.check += b;
            }
            self.inner.write(buf)
        }

        fn flush(&mut self) -> binrw::io::Result<()> {
            self.inner.flush()
        }
    }

    impl<T: Seek> Seek for Checksum<T> {
        fn seek(&mut self, pos: SeekFrom) -> binrw::io::Result<u64> {
            self.inner.seek(pos)
        }
    }

    #[binwrite]
    #[bw(little, stream = w, map_stream = Checksum::new)]
    struct Test {
        a: u16,
        b: u16,
        #[bw(calc(w.check()))]
        c: u8,
    }

    let mut out = Cursor::new(vec![]);
    Test { a: 0x201, b: 0x403 }.write(&mut out).unwrap();

    assert_eq!(out.into_inner(), b"\x01\x02\x03\x04\x0a");
}