From a245b635c9099448a00eea15cec5bc61dcf1d026 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 15 Jul 2024 13:58:32 +0900 Subject: initial implementation --- src/main.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 0672e51..c113039 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,76 @@ -fn main() { - println!("Hello, World!"); +use reparojson::{self, RepairErr, RepairOk, RepairResult}; +use std::ffi::{OsStr, OsString}; +use std::fs::File; +use std::io::{stdin, stdout, BufReader, BufWriter, Write}; +use std::process::ExitCode; + +struct Config { + quiet: bool, + file_path: Option, +} + +fn parse_args() -> std::io::Result { + use clap::{arg, command, value_parser}; + + let matches = command!() + .arg(arg!(-q --quiet "Successfully exit if the input JSON is repaired")) + .arg( + arg!([FILE] "The input JSON file (default: STDIN)") + .value_parser(value_parser!(OsString)), + ) + .get_matches(); + + let quiet = matches.get_flag("quiet"); + let file_path = matches.get_one("FILE").cloned(); + Ok(Config { quiet, file_path }) +} + +fn repair(input_file_path: Option, mut w: impl Write) -> RepairResult { + match input_file_path.as_ref() { + None => { + let reader = stdin().lock(); + let reader = BufReader::new(reader); + reparojson::repair(reader, &mut w) + } + Some(file_path) => { + if file_path == OsStr::new("-") { + let reader = stdin().lock(); + let reader = BufReader::new(reader); + reparojson::repair(reader, &mut w) + } else { + let reader = File::open(file_path)?; + let reader = BufReader::new(reader); + reparojson::repair(reader, &mut w) + } + } + } +} + +fn main() -> std::io::Result { + let config = parse_args()?; + + let writer = stdout().lock(); + let mut writer = BufWriter::new(writer); + + let exit_code = match repair(config.file_path, &mut writer) { + Ok(RepairOk::Valid) => ExitCode::SUCCESS, + Ok(RepairOk::Repaired) => { + if config.quiet { + ExitCode::SUCCESS + } else { + ExitCode::from(1) + } + } + Err(RepairErr::Invalid(err)) => { + eprintln!("{}", err); + ExitCode::from(2) + } + Err(RepairErr::IoErr(err)) => { + eprintln!("{}", err); + ExitCode::from(3) + } + }; + + writer.flush()?; + Ok(exit_code) } -- cgit v1.2.3-70-g09d2