zip_extensions/
default_entry_handler.rs

1use crate::entry_handler::EntryHandler;
2use crate::file_utils::{make_relative_path, path_as_string};
3use std::fs::File;
4use std::io;
5use std::io::{Read, Write};
6use std::path::PathBuf;
7use zip::result::ZipResult;
8use zip::write::{FileOptionExtension, FileOptions};
9use zip::ZipWriter;
10
11pub struct DefaultEntryHandler;
12
13impl<T: FileOptionExtension> EntryHandler<T> for DefaultEntryHandler {
14    fn handle_entry<W: Write + io::Seek>(
15        &self,
16        writer: &mut ZipWriter<W>,
17        root: &PathBuf,
18        entry_path: &PathBuf,
19        file_options: FileOptions<T>,
20        buffer: &mut Vec<u8>,
21    ) -> ZipResult<()> {
22        let metadata = std::fs::metadata(entry_path)?;
23        let relative = make_relative_path(root, entry_path);
24
25        if metadata.is_file() {
26            let mut f = File::open(&entry_path)?;
27            f.read_to_end(buffer)?;
28            writer.start_file(path_as_string(&relative), file_options)?;
29            writer.write_all(buffer.as_ref())?;
30            buffer.clear();
31        } else if metadata.is_dir() {
32            writer.add_directory(path_as_string(&relative), file_options)?;
33        }
34        Ok(())
35    }
36}