From 8aefe88104e097b79c5b5553627c1a762555435b Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Sat, 6 Jul 2024 13:38:35 -0700 Subject: [PATCH] Add compression level option to serde.compress (#224) --- crates/lune-std-serde/src/compress_decompress.rs | 12 +++++++++--- crates/lune-std-serde/src/lib.rs | 4 ++-- types/serde.luau | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/crates/lune-std-serde/src/compress_decompress.rs b/crates/lune-std-serde/src/compress_decompress.rs index 3e5aaa0..86b5c87 100644 --- a/crates/lune-std-serde/src/compress_decompress.rs +++ b/crates/lune-std-serde/src/compress_decompress.rs @@ -13,6 +13,7 @@ use async_compression::{ BrotliDecoder, BrotliEncoder, GzipDecoder, GzipEncoder, ZlibDecoder, ZlibEncoder, }, Level::Best as CompressionQuality, + Level::Precise as PreciseCompressionQuality, }; /** @@ -119,6 +120,7 @@ impl<'lua> FromLua<'lua> for CompressDecompressFormat { pub async fn compress<'lua>( source: impl AsRef<[u8]>, format: CompressDecompressFormat, + level: Option, ) -> LuaResult> { if let CompressDecompressFormat::LZ4 = format { let source = source.as_ref().to_vec(); @@ -130,18 +132,22 @@ pub async fn compress<'lua>( let mut bytes = Vec::new(); let reader = BufReader::new(source.as_ref()); + let compression_quality = match level { + Some(l) => PreciseCompressionQuality(l), + None => CompressionQuality, + }; match format { CompressDecompressFormat::Brotli => { - let mut encoder = BrotliEncoder::with_quality(reader, CompressionQuality); + let mut encoder = BrotliEncoder::with_quality(reader, compression_quality); copy(&mut encoder, &mut bytes).await?; } CompressDecompressFormat::GZip => { - let mut encoder = GzipEncoder::with_quality(reader, CompressionQuality); + let mut encoder = GzipEncoder::with_quality(reader, compression_quality); copy(&mut encoder, &mut bytes).await?; } CompressDecompressFormat::ZLib => { - let mut encoder = ZlibEncoder::with_quality(reader, CompressionQuality); + let mut encoder = ZlibEncoder::with_quality(reader, compression_quality); copy(&mut encoder, &mut bytes).await?; } CompressDecompressFormat::LZ4 => unreachable!(), diff --git a/crates/lune-std-serde/src/lib.rs b/crates/lune-std-serde/src/lib.rs index 4a66adf..26ee26a 100644 --- a/crates/lune-std-serde/src/lib.rs +++ b/crates/lune-std-serde/src/lib.rs @@ -46,9 +46,9 @@ fn serde_decode(lua: &Lua, (format, bs): (EncodeDecodeFormat, BString)) -> LuaRe async fn serde_compress( lua: &Lua, - (format, bs): (CompressDecompressFormat, BString), + (format, bs, level): (CompressDecompressFormat, BString, Option), ) -> LuaResult { - let bytes = compress(bs, format).await?; + let bytes = compress(bs, format, level).await?; lua.create_string(bytes) } diff --git a/types/serde.luau b/types/serde.luau index aa17edc..cd2658d 100644 --- a/types/serde.luau +++ b/types/serde.luau @@ -136,9 +136,10 @@ end @param format The format to use @param s The string to compress + @param level The compression level to use, clamped to the format's limits. The best compression level is used by default @return The compressed string ]=] -function serde.compress(format: CompressDecompressFormat, s: buffer | string): string +function serde.compress(format: CompressDecompressFormat, s: buffer | string, level: number?): string return nil :: any end