use std::{fs::File, io::{self, BufReader}};
use atty::{isnt, Stream};
use indicatif::ProgressBar;
use io_arg::IoArg;
use clap::Parser;
#[derive(Debug, Parser)]
struct Cli {
input: IoArg,
#[clap(long, short = 'o', default_value = "-")]
output: IoArg,
}
fn main() -> io::Result<()> {
let args = Cli::parse();
let progress_bar = if args.input.is_file() && (args.output.is_file() || isnt(Stream::Stdout)) {
let progress_bar = ProgressBar::new(0);
Some(progress_bar)
} else {
None
};
let input: Box<dyn io::BufRead> = match args.input {
IoArg::File(input) => {
let file = File::open(input)?;
if let Some(progress_bar) = &progress_bar {
let len = file.metadata()?.len();
progress_bar.set_length(len);
let file_with_pbar = progress_bar.wrap_read(file);
Box::new(BufReader::new(file_with_pbar))
} else {
Box::new(BufReader::new(file))
}
}
IoArg::StdStream => {
Box::new(io::stdin().lock())
}
};
let output = args.output.open_as_output()?.into_write();
let _ = input;
let _ = output;
Ok(())
}