Skip to main content

storekit/
archive.rs

1use std::path::Path;
2#[cfg(test)]
3use std::path::PathBuf;
4
5pub fn gzip_file(from: &Path, into: &Path) -> std::io::Result<()> {
6    let mut source = std::fs::File::open(from)?;
7    let target = std::fs::File::create(into)?;
8    let mut encoder = flate2::write::GzEncoder::new(target, flate2::Compression::default());
9    std::io::copy(&mut source, &mut encoder)?;
10    encoder.finish()?.sync_all()
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16
17    fn scratch(prefix: &str) -> tempfile::TempDir {
18        let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tmp/testscratch");
19        std::fs::create_dir_all(&root).unwrap();
20        tempfile::Builder::new()
21            .prefix(prefix)
22            .tempdir_in(&root)
23            .unwrap()
24    }
25
26    #[test]
27    fn gzip_file_round_trips_the_exact_bytes() {
28        let dir = scratch("archive-gzip-");
29        let from = dir.path().join("plain");
30        let into = dir.path().join("compressed.gz");
31        std::fs::write(&from, b"the quick brown fox jumps over the lazy dog").unwrap();
32
33        gzip_file(&from, &into).unwrap();
34
35        let compressed = std::fs::read(&into).unwrap();
36        assert!(!compressed.is_empty());
37        let mut decoder = flate2::read::GzDecoder::new(&compressed[..]);
38        let mut restored = Vec::new();
39        std::io::Read::read_to_end(&mut decoder, &mut restored).unwrap();
40        assert_eq!(restored, b"the quick brown fox jumps over the lazy dog");
41    }
42}