use std::fs::File;
use std::io::Write;
use std::path::{Path, PathBuf};
use walkdir::WalkDir;
use std::io::Read;
use zip::{write::SimpleFileOptions, CompressionMethod, ZipWriter};
pub fn zip_folder(folder: &Path) -> anyhow::Result<PathBuf> {
if !folder.is_dir() {
anyhow::bail!("Provided path is not a directory: {:?}", folder);
}
let zip_path = folder.with_extension("zip");
let file = File::create(&zip_path)?;
let mut zip = ZipWriter::new(file);
let options = SimpleFileOptions::default()
.compression_method(CompressionMethod::Deflated)
.unix_permissions(0o755);
let mut buffer = Vec::new();
for entry in WalkDir::new(folder).into_iter().filter_map(Result::ok) {
let path = entry.path();
let name = path.strip_prefix(folder)?;
if path.is_file() {
zip.start_file(name.to_string_lossy(), options)?;
let mut f = File::open(path)?;
f.read_to_end(&mut buffer)?;
zip.write_all(&buffer)?;
buffer.clear();
} else if path.is_dir() {
zip.add_directory(name.to_string_lossy(), options)?;
}
}
zip.finish()?;
Ok(zip_path)
}