use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Write};
use structopt::StructOpt;
use trait_bound_pretty::{
parser::{E0277Parser, ItemParser},
Pretty,
};
#[derive(Debug, StructOpt)]
struct Opt {
#[structopt(short, long)]
strict: bool,
#[structopt(short, long)]
fail_fast: bool,
#[structopt(short, long)]
bare_item: bool,
}
fn process_lines() -> std::io::Result<()> {
let opt = Opt::from_args();
let item_parser = ItemParser::new();
let e0277_parser = E0277Parser::new();
let stdin = stdin();
let reader = stdin.lock();
let reader = BufReader::new(reader);
let stdout = stdout();
let writer = stdout.lock();
let mut writer = BufWriter::new(writer);
for line in reader.lines() {
let line = line?;
if opt.bare_item {
match item_parser.parse(line.trim()) {
Ok(item) => {
item.pretty_to(&mut writer)?;
writer.write_all(b"\n")?;
}
Err(err) => {
if opt.strict {
writeln!(writer, "{:#?}", err)?;
} else {
writeln!(writer, "{}", line)?;
}
if opt.fail_fast {
break;
}
}
}
} else {
match e0277_parser.parse(line.trim()) {
Ok(item) => {
item.pretty_to(&mut writer)?;
writer.write_all(b"\n")?;
}
Err(err) => {
if opt.strict {
writeln!(writer, "{:#?}", err)?;
} else {
writeln!(writer, "{}", line)?;
}
if opt.fail_fast {
break;
}
}
}
}
writer.flush()?;
}
Ok(())
}
fn main() {
let _ = process_lines();
}