From c2f0582d1907dbef69e9ad42ba9d4301337fe1e8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 23 Oct 2021 12:41:52 +0530 Subject: initial implementation of multipass code fixer --- bin/src/main.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'bin/src/main.rs') diff --git a/bin/src/main.rs b/bin/src/main.rs index 161dcab..4cd525a 100644 --- a/bin/src/main.rs +++ b/bin/src/main.rs @@ -1,27 +1,50 @@ mod config; mod err; +mod fix; mod lint; mod traits; use std::io; -use crate::{err::StatixErr, traits::WriteDiagnostic}; +use crate::{ + err::{FixErr, StatixErr}, + traits::WriteDiagnostic, +}; use clap::Clap; -use config::{LintConfig, Opts, SubCommand}; +use config::{FixConfig, LintConfig, Opts, SubCommand}; +use similar::TextDiff; fn _main() -> Result<(), StatixErr> { let opts = Opts::parse(); match opts.subcmd { Some(SubCommand::Fix(_)) => { - eprintln!("`fix` not yet supported"); + let fix_config = FixConfig::from_opts(opts)?; + let vfs = fix_config.vfs()?; + for entry in vfs.iter() { + match fix::fix(entry.contents) { + Ok(fix_result) => { + 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) + ); + } + Err(e) => eprintln!("{}", FixErr::Parse(entry.file_path.to_path_buf(), e)), + } + } } None => { let lint_config = LintConfig::from_opts(opts)?; let vfs = lint_config.vfs()?; - let (reports, errors): (Vec<_>, Vec<_>) = + let (lints, errors): (Vec<_>, Vec<_>) = vfs.iter().map(lint::lint).partition(Result::is_ok); - let lint_results = reports.into_iter().map(Result::unwrap); + let lint_results = lints.into_iter().map(Result::unwrap); let errors = errors.into_iter().map(Result::unwrap_err); let mut stderr = io::stderr(); -- cgit v1.2.3