From: Lizzy Fleckenstein Date: Tue, 14 Feb 2023 15:13:37 +0000 (+0100) Subject: Implement zstd compression X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=cb575e5bb1eef9afc2b732e77108fe7e11e68ef5;p=mt_ser.git Implement zstd compression --- diff --git a/Cargo.toml b/Cargo.toml index c6c80f4..56363d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 5b80762..d4d8991 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -174,19 +174,14 @@ pub fn mt_derive(attr: TokenStream, item: TokenStream) -> TokenStream { struct MtArgs { #[darling(multiple)] const_before: Vec, // must implement MtSerialize + MtDeserialize + PartialEq - #[darling(multiple)] const_after: Vec, // must implement MtSerialize + MtDeserialize + PartialEq - size: Option, // must implement MtCfg - - len: Option, // must implement MtCfg - + len: Option, // 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, 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, 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 { diff --git a/src/lib.rs b/src/lib.rs index 498a4c9..961e416 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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};