blob: 5a4e89b07ad6381bb6516edf8c3ea040daf7dd9f [file] [log] [blame]
use clap::{App, Arg};
use std::fs;
use std::io;
fn main() {
// This will be a simple application:
// takes a single (repeatable and optional) argument.
let matches = App::new("zstdcat")
.version("0.1")
.author("Yann Collet (zstd), Alexandre Bury (zstd-rs)")
.about("Decompress FILEs to standard output.")
.arg(Arg::new("FILE").index(1).multiple_occurrences(true).help(
"Files to decompress. With no file, or when given -, \
read standard input.",
))
.get_matches();
// If nothign was given, act as if `-` was there.
match matches.values_of("FILE") {
None => decompress_file("-").unwrap(),
Some(files) => {
// Decompress each file sequentially.
for file in files {
decompress_file(file).unwrap();
}
}
}
}
// Dispatch the source reader depending on the filename
fn decompress_file(file: &str) -> io::Result<()> {
match file {
"-" => decompress_from(io::stdin()),
other => decompress_from(io::BufReader::new(fs::File::open(other)?)),
}
}
// Decompress from a `Reader` into stdout
fn decompress_from<R: io::Read>(r: R) -> io::Result<()> {
let mut decoder = zstd::Decoder::new(r)?;
io::copy(&mut decoder, &mut io::stdout())?;
Ok(())
}