Browse Source

Add field conversion helpers

Kevin Lee 1 year ago
parent
commit
bdb4451fd2
4 changed files with 33 additions and 10 deletions
  1. 10 0
      src/ezcad/array_of.rs
  2. 5 6
      src/ezcad/basic_field.rs
  3. 10 0
      src/ezcad/field_of.rs
  4. 8 4
      tests/basic_field.rs

+ 10 - 0
src/ezcad/array_of.rs

@@ -41,3 +41,13 @@ where
         &mut self.value
     }
 }
+
+impl<T> From<Vec<T>> for ArrayOf<T>
+where
+    T: for<'a> BinRead<Args<'a> = ()> + 'static,
+    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
+{
+    fn from(value: Vec<T>) -> Self {
+        Self { value }
+    }
+}

+ 5 - 6
src/ezcad/basic_field.rs

@@ -1,12 +1,11 @@
 use binrw::{BinRead, BinWrite};
 
+use crate::field_of::FieldOf;
+
 /// Wrapper for basic types determined by initial u32 size
 #[derive(BinRead, BinWrite, PartialEq, Debug)]
 pub enum BasicField {
-    #[brw(magic(2u32))]
-    U16(u16),
-    #[brw(magic(4u32))]
-    U32(u32),
-    #[brw(magic(8u32))]
-    Double(f64),
+    U16(FieldOf<u16>),
+    U32(FieldOf<u32>),
+    Double(FieldOf<f64>),
 }

+ 10 - 0
src/ezcad/field_of.rs

@@ -41,3 +41,13 @@ where
         &mut self.value
     }
 }
+
+impl<T> From<T> for FieldOf<T>
+where
+    T: for<'a> BinRead<Args<'a> = ()>,
+    T: for<'a> BinWrite<Args<'a> = ()>,
+{
+    fn from(value: T) -> Self {
+        Self { value }
+    }
+}

+ 8 - 4
tests/basic_field.rs

@@ -11,11 +11,13 @@ fn field_u32_be() {
     let mut stream: Cursor<Vec<u8>> = Cursor::new(encoded.clone());
     assert_eq!(
         BasicField::read_be(&mut stream).unwrap(),
-        BasicField::U32(decoded)
+        BasicField::U32(decoded.into())
     );
 
     let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
-    BasicField::U32(decoded).write_be(&mut buffer).unwrap();
+    BasicField::U32(decoded.into())
+        .write_be(&mut buffer)
+        .unwrap();
     assert_eq!(buffer.into_inner(), encoded);
 }
 
@@ -27,10 +29,12 @@ fn field_u32_le() {
     let mut stream: Cursor<Vec<u8>> = Cursor::new(encoded.clone());
     assert_eq!(
         BasicField::read_le(&mut stream).unwrap(),
-        BasicField::U32(decoded)
+        BasicField::U32(decoded.into())
     );
 
     let mut buffer: Cursor<Vec<u8>> = Cursor::new(vec![]);
-    BasicField::U32(decoded).write_le(&mut buffer).unwrap();
+    BasicField::U32(decoded.into())
+        .write_le(&mut buffer)
+        .unwrap();
     assert_eq!(buffer.into_inner(), encoded);
 }