From 5f0a1e67c64082c848418daa2b51020eb42c5c12 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 25 Oct 2021 22:08:52 +0530 Subject: rework cli, use subcommands instead --- bin/src/main.rs | 72 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 32 deletions(-) (limited to 'bin/src/main.rs') diff --git a/bin/src/main.rs b/bin/src/main.rs index d0f69a0..9c57d91 100644 --- a/bin/src/main.rs +++ b/bin/src/main.rs @@ -6,50 +6,58 @@ mod traits; use std::io; -use crate::{err::{StatixErr, FixErr}, traits::WriteDiagnostic}; +use crate::{err::{StatixErr, FixErr, SingleFixErr}, traits::WriteDiagnostic}; use clap::Clap; -use config::{FixConfig, LintConfig, Opts}; +use config::{Opts, SubCommand}; use similar::TextDiff; fn _main() -> Result<(), StatixErr> { let opts = Opts::parse(); - if opts.fix { - let fix_config = FixConfig::from_opts(opts)?; - let vfs = fix_config.vfs()?; - for entry in vfs.iter() { - if let Some(fix_result) = fix::fix(entry.contents) { - if fix_config.diff_only { - let text_diff = TextDiff::from_lines(entry.contents, &fix_result.src); - let old_file = format!("{}", entry.file_path.display()); - let new_file = format!("{} [fixed]", entry.file_path.display()); - println!( - "{}", - text_diff + match opts.cmd { + SubCommand::Check(check_config) => { + let vfs = check_config.vfs()?; + let (lints, errors): (Vec<_>, Vec<_>) = vfs.iter().map(lint::lint).partition(Result::is_ok); + let lint_results = lints.into_iter().map(Result::unwrap); + let errors = errors.into_iter().map(Result::unwrap_err); + + let mut stdout = io::stdout(); + lint_results.for_each(|r| { + stdout.write(&r, &vfs, check_config.format).unwrap(); + }); + errors.for_each(|e| { + eprintln!("{}", e); + }); + }, + SubCommand::Fix(fix_config) => { + let vfs = fix_config.vfs()?; + for entry in vfs.iter() { + if let Some(fix_result) = fix::all(entry.contents) { + if fix_config.diff_only { + let text_diff = TextDiff::from_lines(entry.contents, &fix_result.src); + let old_file = format!("{}", entry.file_path.display()); + let new_file = format!("{} [fixed]", entry.file_path.display()); + println!( + "{}", + text_diff .unified_diff() .context_radius(4) .header(&old_file, &new_file) - ); - } else { - let path = entry.file_path; - std::fs::write(path, &*fix_result.src).map_err(FixErr::InvalidPath)?; + ); + } else { + let path = entry.file_path; + std::fs::write(path, &*fix_result.src).map_err(FixErr::InvalidPath)?; + } } } + }, + SubCommand::Single(single_config) => { + let path = single_config.target; + let src = std::fs::read_to_string(&path).map_err(SingleFixErr::InvalidPath)?; + let (line, col) = single_config.position; + let single_result = fix::single(line, col, &src)?; + std::fs::write(&path, &*single_result.src).map_err(SingleFixErr::InvalidPath)?; } - } else { - let lint_config = LintConfig::from_opts(opts)?; - let vfs = lint_config.vfs()?; - let (lints, errors): (Vec<_>, Vec<_>) = vfs.iter().map(lint::lint).partition(Result::is_ok); - let lint_results = lints.into_iter().map(Result::unwrap); - let errors = errors.into_iter().map(Result::unwrap_err); - - let mut stdout = io::stdout(); - lint_results.for_each(|r| { - stdout.write(&r, &vfs, lint_config.format).unwrap(); - }); - errors.for_each(|e| { - eprintln!("{}", e); - }); } Ok(()) } -- cgit v1.2.3