use binrw::{binread, binwrite, BinRead, BinWrite}; use std::{mem::size_of, ops::{DerefMut, Deref}}; /// Wrapper to prefix arbitrary structs with size of struct as u32 #[binwrite] #[binread] #[derive(Debug, PartialEq)] pub struct FieldOf where T: for<'a> BinRead = ()> + Default, T: for<'a> BinWrite = ()> + Default, { // Temporary variable that must match size of value #[br(temp, assert(size == size_of::().try_into().unwrap()))] #[bw(try_calc(u32::try_from(size_of::())))] size: u32, pub value: T, } impl Deref for FieldOf where T: for<'a> BinRead = ()> + Default, T: for<'a> BinWrite = ()> + Default, { type Target = T; fn deref(&self) -> &Self::Target { &self.value } } impl DerefMut for FieldOf where T: for<'a> BinRead = ()> + Default, T: for<'a> BinWrite = ()> + Default, { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.value } }