field_of.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use binrw::{binread, binwrite, BinRead, BinWrite};
  2. use std::mem::size_of;
  3. #[binwrite]
  4. #[binread]
  5. #[derive(Debug, PartialEq)]
  6. struct FieldOf<T>
  7. where
  8. T: for<'a> BinRead<Args<'a> = ()> + Default,
  9. T: for<'a> BinWrite<Args<'a> = ()> + Default,
  10. {
  11. #[br(temp, assert(size == size_of::<T>().try_into().unwrap()))]
  12. #[bw(try_calc(u32::try_from(size_of::<T>())))]
  13. size: u32,
  14. pub value: T,
  15. }
  16. #[cfg(test)]
  17. mod tests {
  18. use std::io::Cursor;
  19. use super::*;
  20. #[test]
  21. fn field_of_be() {
  22. #[derive(BinRead, BinWrite, Debug, PartialEq, Default)]
  23. struct Test {
  24. a: u32,
  25. b: u32,
  26. }
  27. let decoded: FieldOf<Test> = FieldOf {
  28. value: Test {
  29. a: 0x0A0B0C0D,
  30. b: 0x01020304,
  31. },
  32. };
  33. let encoded: Vec<u8> = vec![
  34. 0x00, 0x00, 0x00, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x01, 0x02, 0x03, 0x04,
  35. ];
  36. let mut stream: Cursor<Vec<u8>> = Cursor::new(encoded.clone());
  37. assert_eq!(FieldOf::<Test>::read_be(&mut stream).unwrap(), decoded);
  38. let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
  39. decoded.write_be(&mut buffer).unwrap();
  40. assert_eq!(buffer.into_inner(), encoded);
  41. }
  42. #[test]
  43. fn field_of_le() {
  44. #[derive(BinRead, BinWrite, Debug, PartialEq, Default)]
  45. struct Test {
  46. a: u32,
  47. b: u32,
  48. }
  49. let decoded: FieldOf<Test> = FieldOf {
  50. value: Test {
  51. a: 0x0A0B0C0D,
  52. b: 0x01020304,
  53. },
  54. };
  55. let encoded: Vec<u8> = vec![
  56. 0x08, 0x00, 0x00, 0x00, 0x0D, 0x0C, 0x0B, 0x0A, 0x04, 0x03, 0x02, 0x01,
  57. ];
  58. let mut stream: Cursor<Vec<u8>> = Cursor::new(encoded.clone());
  59. assert_eq!(FieldOf::<Test>::read_le(&mut stream).unwrap(), decoded);
  60. let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
  61. decoded.write_le(&mut buffer).unwrap();
  62. assert_eq!(buffer.into_inner(), encoded);
  63. }
  64. }