use clap::{AppSettings, Parser};
use std::path::PathBuf;
use std::io::{Read, Write, stdin, stdout};
use std::fs::File;
use json_key_remover::KeyRemover;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
#[clap(global_setting(AppSettings::DeriveDisplayOrder))]
struct Args {
#[clap(short, long, value_parser, value_name = "KEY1,KEY2,...,KEYn")]
keys: String,
#[clap(short, long, value_parser, value_name = "FILE")]
input: Option<PathBuf>,
#[clap(short, long, value_parser, value_name = "FILE")]
output: Option<PathBuf>,
#[clap(short, long, value_parser, default_value_t = 64*1024)]
size: u32,
}
fn main() {
let args = Args::parse();
let reader: Box<dyn Read> = if let Some(path_buf) = &args.input {
Box::new(File::open(path_buf).unwrap())
} else {
let stdin = stdin();
Box::new(stdin)
};
let writer: Box<dyn Write> = if let Some(path_buf) = &args.output {
Box::new(File::create(path_buf).unwrap())
} else {
let stdout = stdout();
Box::new(stdout)
};
let keys_to_remove: Vec<String> = args.keys.split(',').map(|x| x.to_string()).collect();
eprintln!("To remove");
for (idx, key) in keys_to_remove.iter().enumerate() {
eprintln!(" {}: {}", idx+1, key);
}
let buffer_size = args.size as usize;
let mut key_remover = KeyRemover::init(buffer_size, keys_to_remove);
key_remover.process(reader, writer);
}