diff options
Diffstat (limited to 'bin/src/main.rs')
-rw-r--r-- | bin/src/main.rs | 72 |
1 files changed, 40 insertions, 32 deletions
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; | |||
6 | 6 | ||
7 | use std::io; | 7 | use std::io; |
8 | 8 | ||
9 | use crate::{err::{StatixErr, FixErr}, traits::WriteDiagnostic}; | 9 | use crate::{err::{StatixErr, FixErr, SingleFixErr}, traits::WriteDiagnostic}; |
10 | 10 | ||
11 | use clap::Clap; | 11 | use clap::Clap; |
12 | use config::{FixConfig, LintConfig, Opts}; | 12 | use config::{Opts, SubCommand}; |
13 | use similar::TextDiff; | 13 | use similar::TextDiff; |
14 | 14 | ||
15 | fn _main() -> Result<(), StatixErr> { | 15 | fn _main() -> Result<(), StatixErr> { |
16 | let opts = Opts::parse(); | 16 | let opts = Opts::parse(); |
17 | if opts.fix { | 17 | match opts.cmd { |
18 | let fix_config = FixConfig::from_opts(opts)?; | 18 | SubCommand::Check(check_config) => { |
19 | let vfs = fix_config.vfs()?; | 19 | let vfs = check_config.vfs()?; |
20 | for entry in vfs.iter() { | 20 | let (lints, errors): (Vec<_>, Vec<_>) = vfs.iter().map(lint::lint).partition(Result::is_ok); |
21 | if let Some(fix_result) = fix::fix(entry.contents) { | 21 | let lint_results = lints.into_iter().map(Result::unwrap); |
22 | if fix_config.diff_only { | 22 | let errors = errors.into_iter().map(Result::unwrap_err); |
23 | let text_diff = TextDiff::from_lines(entry.contents, &fix_result.src); | 23 | |
24 | let old_file = format!("{}", entry.file_path.display()); | 24 | let mut stdout = io::stdout(); |
25 | let new_file = format!("{} [fixed]", entry.file_path.display()); | 25 | lint_results.for_each(|r| { |
26 | println!( | 26 | stdout.write(&r, &vfs, check_config.format).unwrap(); |
27 | "{}", | 27 | }); |
28 | text_diff | 28 | errors.for_each(|e| { |
29 | eprintln!("{}", e); | ||
30 | }); | ||
31 | }, | ||
32 | SubCommand::Fix(fix_config) => { | ||
33 | let vfs = fix_config.vfs()?; | ||
34 | for entry in vfs.iter() { | ||
35 | if let Some(fix_result) = fix::all(entry.contents) { | ||
36 | if fix_config.diff_only { | ||
37 | let text_diff = TextDiff::from_lines(entry.contents, &fix_result.src); | ||
38 | let old_file = format!("{}", entry.file_path.display()); | ||
39 | let new_file = format!("{} [fixed]", entry.file_path.display()); | ||
40 | println!( | ||
41 | "{}", | ||
42 | text_diff | ||
29 | .unified_diff() | 43 | .unified_diff() |
30 | .context_radius(4) | 44 | .context_radius(4) |
31 | .header(&old_file, &new_file) | 45 | .header(&old_file, &new_file) |
32 | ); | 46 | ); |
33 | } else { | 47 | } else { |
34 | let path = entry.file_path; | 48 | let path = entry.file_path; |
35 | std::fs::write(path, &*fix_result.src).map_err(FixErr::InvalidPath)?; | 49 | std::fs::write(path, &*fix_result.src).map_err(FixErr::InvalidPath)?; |
50 | } | ||
36 | } | 51 | } |
37 | } | 52 | } |
53 | }, | ||
54 | SubCommand::Single(single_config) => { | ||
55 | let path = single_config.target; | ||
56 | let src = std::fs::read_to_string(&path).map_err(SingleFixErr::InvalidPath)?; | ||
57 | let (line, col) = single_config.position; | ||
58 | let single_result = fix::single(line, col, &src)?; | ||
59 | std::fs::write(&path, &*single_result.src).map_err(SingleFixErr::InvalidPath)?; | ||
38 | } | 60 | } |
39 | } else { | ||
40 | let lint_config = LintConfig::from_opts(opts)?; | ||
41 | let vfs = lint_config.vfs()?; | ||
42 | let (lints, errors): (Vec<_>, Vec<_>) = vfs.iter().map(lint::lint).partition(Result::is_ok); | ||
43 | let lint_results = lints.into_iter().map(Result::unwrap); | ||
44 | let errors = errors.into_iter().map(Result::unwrap_err); | ||
45 | |||
46 | let mut stdout = io::stdout(); | ||
47 | lint_results.for_each(|r| { | ||
48 | stdout.write(&r, &vfs, lint_config.format).unwrap(); | ||
49 | }); | ||
50 | errors.for_each(|e| { | ||
51 | eprintln!("{}", e); | ||
52 | }); | ||
53 | } | 61 | } |
54 | Ok(()) | 62 | Ok(()) |
55 | } | 63 | } |