refactor: pretty-print bytes
[ouch.git] / src / compressors / gzip.rs
blobb01208b3516a7dfff72ac80473042503b8d11adc
1 use std::{fs, io::Write, path::PathBuf};
3 use colored::Colorize;
5 use super::{Compressor, Entry};
6 use crate::{
7     extension::CompressionFormat,
8     file::File,
9     bytes::Bytes,
10     utils::{check_for_multiple_files, ensure_exists},
13 pub struct GzipCompressor {}
15 impl GzipCompressor {
16     pub fn compress_files(
17         files: Vec<PathBuf>,
18         format: CompressionFormat,
19     ) -> crate::Result<Vec<u8>> {
20         check_for_multiple_files(&files, &format)?;
22         let path = &files[0];
23         ensure_exists(path)?;
25         let bytes = {
26             let bytes = fs::read(path)?;
27             Self::compress_bytes(bytes)?
28         };
30         println!(
31             "{}: compressed {:?} into memory ({})",
32             "info".yellow(),
33             &path,
34             Bytes::new(bytes.len() as u64)
35         );
37         Ok(bytes)
38     }
40     pub fn compress_file_in_memory(file: File) -> crate::Result<Vec<u8>> {
41         let file_contents = match file.contents_in_memory {
42             Some(bytes) => bytes,
43             None => {
44                 unreachable!();
45             }
46         };
48         Self::compress_bytes(file_contents)
49     }
51     pub fn compress_bytes(bytes_to_compress: Vec<u8>) -> crate::Result<Vec<u8>> {
52         let buffer = vec![];
53         let mut encoder = flate2::write::GzEncoder::new(buffer, flate2::Compression::default());
54         encoder.write_all(&*bytes_to_compress)?;
56         Ok(encoder.finish()?)
57     }
60 impl Compressor for GzipCompressor {
61     fn compress(&self, from: Entry) -> crate::Result<Vec<u8>> {
62         let format = CompressionFormat::Gzip;
63         match from {
64             Entry::Files(files) => Ok(Self::compress_files(files, format)?),
65             Entry::InMemory(file) => Ok(Self::compress_file_in_memory(file)?),
66         }
67     }