]> git.lizzy.rs Git - mt_ser.git/commitdiff
Implement zstd compression
authorLizzy Fleckenstein <eliasfleckenstein@web.de>
Tue, 14 Feb 2023 15:13:37 +0000 (16:13 +0100)
committerLizzy Fleckenstein <eliasfleckenstein@web.de>
Tue, 14 Feb 2023 15:13:40 +0000 (16:13 +0100)
Cargo.toml
derive/src/lib.rs
src/lib.rs

index c6c80f4e9d85bb62b7a12851210bd113fd4881a0..56363d979cac7fb331664e3916f35ba5f82dfe99 100644 (file)
@@ -10,3 +10,4 @@ flate2 = { version = "1.0.25", features = ["zlib"], default-features = false }
 mt_ser_derive = { path = "derive" }
 paste = "1.0.11"
 thiserror = "1.0.38"
+zstd = "0.12.3"
index 5b80762ae6134fc468353b43ea58327ff6129c11..d4d89913c4529558884fd57ad51124e16b62fbc7 100644 (file)
@@ -174,19 +174,14 @@ pub fn mt_derive(attr: TokenStream, item: TokenStream) -> TokenStream {
 struct MtArgs {
     #[darling(multiple)]
     const_before: Vec<syn::Expr>, // must implement MtSerialize + MtDeserialize + PartialEq
-
     #[darling(multiple)]
     const_after: Vec<syn::Expr>, // must implement MtSerialize + MtDeserialize + PartialEq
-
     size: Option<syn::Type>, // must implement MtCfg
-
-    len: Option<syn::Type>, // must implement MtCfg
-
+    len: Option<syn::Type>,  // must implement MtCfg
+    default: bool,           // type must implement Default
+    string_repr: bool,       // for enums
     zlib: bool,
-    zstd: bool,    // TODO
-    default: bool, // type must implement Default
-
-    string_repr: bool, // for enums
+    zstd: bool,
 }
 
 type Fields<'a> = Vec<(TokStr, &'a syn::Field)>;
@@ -213,20 +208,30 @@ fn serialize_args(res: darling::Result<MtArgs>, body: impl FnOnce(&MtArgs) -> To
         Ok(args) => {
             let mut code = body(&args);
 
-            if args.zlib {
-                code = quote! {
-                    let mut __writer = {
-                        let mut __stream = mt_ser::flate2::write::ZlibEncoder::new(
-                            __writer,
-                            mt_ser::flate2::Compression::default(),
-                        );
-                        let __writer = &mut __stream;
-                        #code
-                        __stream.finish()?
+            macro_rules! impl_compress {
+                ($create:expr) => {
+                    code = quote! {
+                        let mut __writer = {
+                            let mut __stream = $create;
+                            let __writer = &mut __stream;
+                            #code
+                            __stream.finish()?
+                        };
                     };
                 };
             }
 
+            if args.zlib {
+                impl_compress!(mt_ser::flate2::write::ZlibEncoder::new(
+                    __writer,
+                    mt_ser::flate2::Compression::default()
+                ));
+            }
+
+            if args.zstd {
+                impl_compress!(mt_ser::zstd::stream::write::Encoder::new(__writer, 0)?);
+            }
+
             if let Some(size) = args.size {
                 code = quote! {
                     mt_ser::MtSerialize::mt_serialize::<#size>(&{
@@ -263,16 +268,29 @@ fn deserialize_args(res: darling::Result<MtArgs>, body: impl FnOnce(&MtArgs) ->
         Ok(args) => {
             let mut code = body(&args);
 
-            if args.zlib {
-                code = quote! {
-                    {
-                        let mut __owned_reader = mt_ser::flate2::read::ZlibDecoder::new(
-                            mt_ser::WrapRead(__reader));
-                        let __reader = &mut __owned_reader;
+            macro_rules! impl_compress {
+                ($create:expr) => {
+                    code = quote! {
+                        {
+                            let mut __owned_reader = $create;
+                            let __reader = &mut __owned_reader;
 
-                        #code
+                            #code
+                        }
                     }
-                }
+                };
+            }
+
+            if args.zlib {
+                impl_compress!(mt_ser::flate2::read::ZlibDecoder::new(mt_ser::WrapRead(
+                    __reader
+                )));
+            }
+
+            if args.zstd {
+                impl_compress!(mt_ser::zstd::stream::read::Decoder::new(mt_ser::WrapRead(
+                    __reader
+                ))?);
             }
 
             if let Some(size) = args.size {
index 498a4c9b27b929912816126cc461ce88220a19ee..961e4169b549c5042c78eed2d3a115ce080bd0da 100644 (file)
@@ -5,6 +5,7 @@
 pub use flate2;
 pub use mt_ser_derive::{mt_derive, MtDeserialize, MtSerialize};
 pub use paste;
+pub use zstd;
 
 use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
 use enumset::{EnumSet, EnumSetTypeWithRepr};