mirror of
https://github.com/ouch-org/ouch.git
synced 2025-06-08 12:35:41 +00:00
Remove duplicated if/else branches
This commit is contained in:
parent
0f3bc4f444
commit
91a1054c3c
142
src/commands.rs
142
src/commands.rs
@ -188,94 +188,74 @@ pub fn run(args: Opts, skip_questions_positively: Option<bool>) -> crate::Result
|
|||||||
fn compress_files(files: Vec<PathBuf>, formats: Vec<CompressionFormat>, output_file: fs::File) -> crate::Result<()> {
|
fn compress_files(files: Vec<PathBuf>, formats: Vec<CompressionFormat>, output_file: fs::File) -> crate::Result<()> {
|
||||||
let file_writer = BufWriter::with_capacity(BUFFER_CAPACITY, output_file);
|
let file_writer = BufWriter::with_capacity(BUFFER_CAPACITY, output_file);
|
||||||
|
|
||||||
if let [Tar | Tgz | Zip] = *formats.as_slice() {
|
let mut writer: Box<dyn Write> = Box::new(file_writer);
|
||||||
match formats[0] {
|
|
||||||
Tar => {
|
// Grab previous encoder and wrap it inside of a new one
|
||||||
let mut bufwriter = archive::tar::build_archive_from_paths(&files, file_writer)?;
|
let chain_writer_encoder = |format: &CompressionFormat, encoder: Box<dyn Write>| {
|
||||||
bufwriter.flush()?;
|
let encoder: Box<dyn Write> = match format {
|
||||||
}
|
Gzip => Box::new(flate2::write::GzEncoder::new(encoder, Default::default())),
|
||||||
Tgz => {
|
Bzip => Box::new(bzip2::write::BzEncoder::new(encoder, Default::default())),
|
||||||
// Wrap it into an gz_decoder, and pass to the tar archive builder
|
Lzma => Box::new(xz2::write::XzEncoder::new(encoder, 6)),
|
||||||
let gz_decoder = flate2::write::GzEncoder::new(file_writer, Default::default());
|
Zstd => {
|
||||||
let mut bufwriter = archive::tar::build_archive_from_paths(&files, gz_decoder)?;
|
let zstd_encoder = zstd::stream::write::Encoder::new(encoder, Default::default());
|
||||||
bufwriter.flush()?;
|
// Safety:
|
||||||
}
|
// Encoder::new() can only fail if `level` is invalid, but Default::default()
|
||||||
Zip => {
|
// is guaranteed to be valid
|
||||||
let mut bufwriter = archive::zip::build_archive_from_paths(&files, file_writer)?;
|
Box::new(zstd_encoder.unwrap().auto_finish())
|
||||||
bufwriter.flush()?;
|
|
||||||
}
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
} else {
|
encoder
|
||||||
let mut writer: Box<dyn Write> = Box::new(file_writer);
|
};
|
||||||
|
|
||||||
// Grab previous encoder and wrap it inside of a new one
|
for format in formats.iter().skip(1).rev() {
|
||||||
let chain_writer_encoder = |format: &CompressionFormat, encoder: Box<dyn Write>| {
|
writer = chain_writer_encoder(format, writer);
|
||||||
let encoder: Box<dyn Write> = match format {
|
}
|
||||||
Gzip => Box::new(flate2::write::GzEncoder::new(encoder, Default::default())),
|
|
||||||
Bzip => Box::new(bzip2::write::BzEncoder::new(encoder, Default::default())),
|
|
||||||
Lzma => Box::new(xz2::write::XzEncoder::new(encoder, 6)),
|
|
||||||
Zstd => {
|
|
||||||
let zstd_encoder = zstd::stream::write::Encoder::new(encoder, Default::default());
|
|
||||||
// Safety:
|
|
||||||
// Encoder::new() can only fail if `level` is invalid, but Default::default()
|
|
||||||
// is guaranteed to be valid
|
|
||||||
Box::new(zstd_encoder.unwrap().auto_finish())
|
|
||||||
}
|
|
||||||
_ => unreachable!(),
|
|
||||||
};
|
|
||||||
encoder
|
|
||||||
};
|
|
||||||
|
|
||||||
for format in formats.iter().skip(1).rev() {
|
match formats[0] {
|
||||||
writer = chain_writer_encoder(format, writer);
|
Gzip | Bzip | Lzma | Zstd => {
|
||||||
|
writer = chain_writer_encoder(&formats[0], writer);
|
||||||
|
let mut reader = fs::File::open(&files[0]).unwrap();
|
||||||
|
io::copy(&mut reader, &mut writer)?;
|
||||||
}
|
}
|
||||||
|
Tar => {
|
||||||
|
let mut writer = archive::tar::build_archive_from_paths(&files, writer)?;
|
||||||
|
writer.flush()?;
|
||||||
|
}
|
||||||
|
Tgz => {
|
||||||
|
let encoder = flate2::write::GzEncoder::new(writer, Default::default());
|
||||||
|
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
||||||
|
writer.finish()?.flush()?;
|
||||||
|
}
|
||||||
|
Tbz => {
|
||||||
|
let encoder = bzip2::write::BzEncoder::new(writer, Default::default());
|
||||||
|
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
||||||
|
writer.finish()?.flush()?;
|
||||||
|
}
|
||||||
|
Tlzma => {
|
||||||
|
let encoder = xz2::write::XzEncoder::new(writer, 6);
|
||||||
|
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
||||||
|
writer.finish()?.flush()?;
|
||||||
|
}
|
||||||
|
Tzst => {
|
||||||
|
let encoder = zstd::stream::write::Encoder::new(writer, Default::default())?;
|
||||||
|
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
||||||
|
writer.finish()?.flush()?;
|
||||||
|
}
|
||||||
|
Zip => {
|
||||||
|
eprintln!("{yellow}Warning:{reset}", yellow = *colors::YELLOW, reset = *colors::RESET);
|
||||||
|
eprintln!("\tCompressing .zip entirely in memory.");
|
||||||
|
eprintln!("\tIf the file is too big, your PC might freeze!");
|
||||||
|
eprintln!(
|
||||||
|
"\tThis is a limitation for formats like '{}'.",
|
||||||
|
formats.iter().map(|format| format.to_string()).collect::<String>()
|
||||||
|
);
|
||||||
|
eprintln!("\tThe design of .zip makes it impossible to compress via stream.");
|
||||||
|
|
||||||
match formats[0] {
|
let mut vec_buffer = io::Cursor::new(vec![]);
|
||||||
Gzip | Bzip | Lzma | Zstd => {
|
archive::zip::build_archive_from_paths(&files, &mut vec_buffer)?;
|
||||||
writer = chain_writer_encoder(&formats[0], writer);
|
let vec_buffer = vec_buffer.into_inner();
|
||||||
let mut reader = fs::File::open(&files[0]).unwrap();
|
io::copy(&mut vec_buffer.as_slice(), &mut writer)?;
|
||||||
io::copy(&mut reader, &mut writer)?;
|
|
||||||
}
|
|
||||||
Tar => {
|
|
||||||
let mut writer = archive::tar::build_archive_from_paths(&files, writer)?;
|
|
||||||
writer.flush()?;
|
|
||||||
}
|
|
||||||
Tgz => {
|
|
||||||
let encoder = flate2::write::GzEncoder::new(writer, Default::default());
|
|
||||||
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
|
||||||
writer.finish()?.flush()?;
|
|
||||||
}
|
|
||||||
Tbz => {
|
|
||||||
let encoder = bzip2::write::BzEncoder::new(writer, Default::default());
|
|
||||||
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
|
||||||
writer.finish()?.flush()?;
|
|
||||||
}
|
|
||||||
Tlzma => {
|
|
||||||
let encoder = xz2::write::XzEncoder::new(writer, 6);
|
|
||||||
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
|
||||||
writer.finish()?.flush()?;
|
|
||||||
}
|
|
||||||
Tzst => {
|
|
||||||
let encoder = zstd::stream::write::Encoder::new(writer, Default::default())?;
|
|
||||||
let writer = archive::tar::build_archive_from_paths(&files, encoder)?;
|
|
||||||
writer.finish()?.flush()?;
|
|
||||||
}
|
|
||||||
Zip => {
|
|
||||||
eprintln!("{yellow}Warning:{reset}", yellow = *colors::YELLOW, reset = *colors::RESET);
|
|
||||||
eprintln!("\tCompressing .zip entirely in memory.");
|
|
||||||
eprintln!("\tIf the file is too big, your PC might freeze!");
|
|
||||||
eprintln!(
|
|
||||||
"\tThis is a limitation for formats like '{}'.",
|
|
||||||
formats.iter().map(|format| format.to_string()).collect::<String>()
|
|
||||||
);
|
|
||||||
eprintln!("\tThe design of .zip makes it impossible to compress via stream.");
|
|
||||||
|
|
||||||
let mut vec_buffer = io::Cursor::new(vec![]);
|
|
||||||
archive::zip::build_archive_from_paths(&files, &mut vec_buffer)?;
|
|
||||||
let vec_buffer = vec_buffer.into_inner();
|
|
||||||
io::copy(&mut vec_buffer.as_slice(), &mut writer)?;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user