use std::io::{Cursor, Write};
use zip::{CompressionMethod, ZipWriter, write::FileOptions};
pub fn create_zip_from_buffers(
file_buffers: Vec<Vec<u8>>,
base_name: &str,
) -> Result<Vec<u8>, crate::error::ServerError> {
let mut zip_buffer = Vec::new();
let cursor = Cursor::new(&mut zip_buffer);
let mut zip = ZipWriter::new(cursor);
let options = FileOptions::<()>::default()
.compression_method(CompressionMethod::Stored)
.large_file(true);
for (i, buffer) in file_buffers.iter().enumerate() {
let file_name = if i == 0 {
format!("{}.parquet", base_name)
} else {
format!("{}_{:03}.parquet", base_name, i + 1)
};
zip.start_file(file_name, options).map_err(|e| {
crate::error::ServerError::InternalError(format!(
"Failed to start ZIP file entry: {}",
e
))
})?;
zip.write_all(buffer).map_err(|e| {
crate::error::ServerError::InternalError(format!("Failed to write to ZIP: {}", e))
})?;
}
zip.finish().map_err(|e| {
crate::error::ServerError::InternalError(format!("Failed to finish ZIP: {}", e))
})?;
Ok(zip_buffer)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_zip_from_buffers() {
let buffers = vec![vec![1u8, 2, 3, 4], vec![5u8, 6, 7, 8]];
let zip_data = create_zip_from_buffers(buffers, "test").unwrap();
assert!(!zip_data.is_empty());
assert_eq!(&zip_data[0..2], b"PK");
}
}