From b09f1f958423dee8c235f2eeb9c148b73936830f Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 24 Oct 2021 13:26:37 +0530 Subject: rework cli, fix is now a flag, implement dry-run mode --- bin/src/fix.rs | 60 +++++++++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) (limited to 'bin/src/fix.rs') diff --git a/bin/src/fix.rs b/bin/src/fix.rs index 478dbd9..d9087fe 100644 --- a/bin/src/fix.rs +++ b/bin/src/fix.rs @@ -65,48 +65,40 @@ pub struct Fixed { impl<'a> FixResult<'a> { fn empty(src: Source<'a>) -> Self { - Self { src, fixed: vec![] } + Self { src, fixed: Vec::new() } } } -fn next(mut src: Source) -> Result { - let all_reports = collect_fixes(&src)?; - - if all_reports.is_empty() { - return Ok(FixResult::empty(src)); - } +impl<'a> Iterator for FixResult<'a> { + type Item = FixResult<'a>; + fn next(&mut self) -> Option { + let all_reports = collect_fixes(&self.src).ok()?; + if all_reports.is_empty() { + return None; + } - let reordered = reorder(all_reports); + let reordered = reorder(all_reports); + let fixed = reordered + .iter() + .map(|r| Fixed { + at: r.range(), + code: r.code, + }) + .collect::>(); + for report in reordered { + report.apply(self.src.to_mut()); + } - let fixed = reordered - .iter() - .map(|r| Fixed { - at: r.range(), - code: r.code, + Some(FixResult { + src: self.src.clone(), + fixed }) - .collect::>(); - for report in reordered { - report.apply(src.to_mut()); } - - Ok(FixResult { - src, - fixed - }) } -pub fn fix(src: &str) -> Result { +pub fn fix(src: &str) -> Option { let src = Cow::from(src); - let _ = rnix::parse(&src).as_result()?; - let mut initial = FixResult::empty(src); - - while let Ok(next_result) = next(initial.src) { - if next_result.fixed.is_empty() { - return Ok(next_result); - } else { - initial = FixResult::empty(next_result.src); - } - } - - unreachable!("a fix caused a syntax error, please report a bug"); + let _ = rnix::parse(&src).as_result().ok()?; + let initial = FixResult::empty(src); + initial.into_iter().last() } -- cgit v1.2.3