Browse Source

Formatting

Kevin Lee 1 year ago
parent
commit
5cfeba5c5d
7 changed files with 150 additions and 30 deletions
  1. 83 0
      Cargo.lock
  2. 1 0
      Cargo.toml
  3. BIN
      data/Rectangle2.mlp
  4. 60 22
      src/ezcad/array_of.rs
  5. 1 1
      src/ezcad/pen.rs
  6. 2 2
      src/ezcad/types.rs
  7. 3 5
      src/main.rs

+ 83 - 0
Cargo.lock

@@ -65,6 +65,12 @@ version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
 
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
 [[package]]
 name = "binrw"
 version = "0.13.3"
@@ -196,6 +202,7 @@ dependencies = [
  "env_logger",
  "log",
  "modular-bitfield",
+ "num",
  "strum",
 ]
 
@@ -273,6 +280,82 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "num"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af"
+dependencies = [
+ "num-bigint",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+dependencies = [
+ "autocfg",
+]
+
 [[package]]
 name = "owo-colors"
 version = "3.5.0"

+ 1 - 0
Cargo.toml

@@ -20,4 +20,5 @@ clap-verbosity-flag = "2.1.1"
 env_logger = "0.10.1"
 log = "0.4.20"
 modular-bitfield = "0.11.2"
+num = "0.4.1"
 strum = { version = "0.25.0", features = ["derive"] }

BIN
data/Rectangle2.mlp


+ 60 - 22
src/ezcad/array_of.rs

@@ -1,20 +1,66 @@
 use binrw::{binrw, BinRead, BinWrite};
+use num::Num;
 use std::{
     fmt::{Debug, Display},
     marker::PhantomData,
     ops::{Deref, DerefMut},
 };
 
-/// Wrapper to prefix array of single type
+/// Supertrait to simplify constraints
+pub trait BinReadWrite:
+    for<'a> BinRead<Args<'a> = ()> + for<'a> BinWrite<Args<'a> = ()> + 'static
+{
+}
+impl<T> BinReadWrite for T where
+    T: for<'a> BinRead<Args<'a> = ()> + for<'a> BinWrite<Args<'a> = ()> + 'static
+{
+}
+
+/// Wrapper to prefix array of primitives (u8/u32/etc)
+#[binrw]
+#[derive(PartialEq)]
+pub struct ArrayOfPrimitive<T, S = u32>
+where
+    // Static bounds due to https://github.com/jam1garner/binrw/issues/199
+    T: BinReadWrite + Num,
+    S: BinReadWrite,
+    S: TryFrom<usize> + Display + Debug + Copy + Clone,
+    <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
+    usize: TryFrom<S>,
+{
+    // Temporary variable that holds number of elements
+    #[br(temp)]
+    #[bw(try_calc(S::try_from(value.len())))]
+    count: S,
+
+    #[br(count = count)]
+    pub value: Vec<T>,
+
+    _marker: PhantomData<S>,
+}
+
+impl<T, S> Debug for ArrayOfPrimitive<T, S>
+where
+    T: BinReadWrite + Num,
+    S: BinReadWrite,
+    T: Debug,
+    S: TryFrom<usize> + Display + Debug + Copy + Clone,
+    <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
+    usize: TryFrom<S>,
+{
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{:?}", self.value)
+    }
+}
+
+/// Wrapper to prefix array of single non-primitive type
 #[binrw]
 #[derive(PartialEq)]
 pub struct ArrayOf<T, S = u32>
 where
     // Static bounds due to https://github.com/jam1garner/binrw/issues/199
-    T: for<'a> BinRead<Args<'a> = ()> + 'static,
-    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
-    S: for<'a> BinRead<Args<'a> = ()> + 'static,
-    S: for<'a> BinWrite<Args<'a> = ()> + 'static,
+    T: BinReadWrite,
+    S: BinReadWrite,
     S: TryFrom<usize> + Display + Debug + Copy + Clone,
     <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
     usize: TryFrom<S>,
@@ -32,26 +78,22 @@ where
 
 impl<T, S> Debug for ArrayOf<T, S>
 where
-    T: for<'a> BinRead<Args<'a> = ()> + 'static,
-    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
+    T: BinReadWrite,
+    S: BinReadWrite,
     T: Debug,
-    S: for<'a> BinRead<Args<'a> = ()> + 'static,
-    S: for<'a> BinWrite<Args<'a> = ()> + 'static,
     S: TryFrom<usize> + Display + Debug + Copy + Clone,
     <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
     usize: TryFrom<S>,
 {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(f, "{:?}", self.value)
+        write!(f, "{:#?}", self.value)
     }
 }
 
 impl<T, S> Deref for ArrayOf<T, S>
 where
-    T: for<'a> BinRead<Args<'a> = ()> + 'static,
-    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
-    S: for<'a> BinRead<Args<'a> = ()> + 'static,
-    S: for<'a> BinWrite<Args<'a> = ()> + 'static,
+    T: BinReadWrite,
+    S: BinReadWrite,
     S: TryFrom<usize> + Display + Debug + Copy + Clone,
     <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
     usize: TryFrom<S>,
@@ -65,10 +107,8 @@ where
 
 impl<T, S> DerefMut for ArrayOf<T, S>
 where
-    T: for<'a> BinRead<Args<'a> = ()> + 'static,
-    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
-    S: for<'a> BinRead<Args<'a> = ()> + 'static,
-    S: for<'a> BinWrite<Args<'a> = ()> + 'static,
+    T: BinReadWrite,
+    S: BinReadWrite,
     S: TryFrom<usize> + Display + Debug + Copy + Clone,
     <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
     usize: TryFrom<S>,
@@ -80,10 +120,8 @@ where
 
 impl<T, S> From<Vec<T>> for ArrayOf<T, S>
 where
-    T: for<'a> BinRead<Args<'a> = ()> + 'static,
-    T: for<'a> BinWrite<Args<'a> = ()> + 'static,
-    S: for<'a> BinRead<Args<'a> = ()> + 'static,
-    S: for<'a> BinWrite<Args<'a> = ()> + 'static,
+    T: BinReadWrite,
+    S: BinReadWrite,
     S: TryFrom<usize> + Display + Debug + Copy + Clone,
     <S as TryFrom<usize>>::Error: Display + Debug + Send + Sync,
     usize: TryFrom<S>,

+ 1 - 1
src/ezcad/pen.rs

@@ -13,7 +13,7 @@ pub struct PenHeader {
             pen_count
         }
     })]
-    pub start_offset: FilePtr64<Pens>,
+    pub data: FilePtr64<Pens>,
 }
 
 #[derive(BinRead, BinWrite, Debug)]

+ 2 - 2
src/ezcad/types.rs

@@ -4,10 +4,10 @@ use std::fmt::{Debug, Display};
 
 use binrw::{binrw, BinRead, BinWrite};
 
-use crate::{array_of::ArrayOf, field_of::FieldOf};
+use crate::{array_of::ArrayOfPrimitive, field_of::FieldOf};
 
 /// Generic field with structure of length + data
-pub type Field = ArrayOf<u8>;
+pub type Field = ArrayOfPrimitive<u8>;
 
 pub type U32 = FieldOf<u32>;
 pub type U16 = FieldOf<u16>;

+ 3 - 5
src/main.rs

@@ -43,14 +43,12 @@ fn main() {
 
     info!("Execution time: {:?}", time.elapsed());
 
-    // for i in 0..50 {
-    //     dbg!(&file.pens_offset.start_offset.pens[i].disabled);
+    // for pen in file.pens.data.pens.iter().take(1) {
+    //     dbg!(pen);
     // }
-    // dbg!(String::from(&file.pens_offset.start_offset.pens[0].name));
-    // dbg!(&file.pens_offset.start_offset.pens[255].wobble_type);
+
     for layer in file.layers.iter() {
         for object in layer.objects.iter() {
-            // info!("{object:?}");
             dbg!(object);
         }
     }