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/fix.rs | 87 ++++------------------------------------------------------ 1 file changed, 6 insertions(+), 81 deletions(-) (limited to 'bin/src/fix.rs') diff --git a/bin/src/fix.rs b/bin/src/fix.rs index d9087fe..a7ddc4f 100644 --- a/bin/src/fix.rs +++ b/bin/src/fix.rs @@ -1,55 +1,14 @@ use std::borrow::Cow; -use lib::{Report, LINTS}; -use rnix::{parser::ParseError as RnixParseErr, TextRange, WalkEvent}; +use rnix::TextRange; -type Source<'a> = Cow<'a, str>; - -fn collect_fixes(source: &str) -> Result, RnixParseErr> { - let parsed = rnix::parse(source).as_result()?; - - Ok(parsed - .node() - .preorder_with_tokens() - .filter_map(|event| match event { - WalkEvent::Enter(child) => LINTS.get(&child.kind()).map(|rules| { - rules - .iter() - .filter_map(|rule| rule.validate(&child)) - .filter(|report| report.total_suggestion_range().is_some()) - .collect::>() - }), - _ => None, - }) - .flatten() - .collect()) -} +mod all; +pub use all::all; -fn reorder(mut reports: Vec) -> Vec { - use std::collections::VecDeque; +mod single; +pub use single::single; - reports.sort_by(|a, b| { - let a_range = a.range(); - let b_range = b.range(); - a_range.end().partial_cmp(&b_range.end()).unwrap() - }); - - reports - .into_iter() - .fold(VecDeque::new(), |mut deque: VecDeque, new_elem| { - let front = deque.front(); - let new_range = new_elem.range(); - if let Some(front_range) = front.map(|f| f.range()) { - if new_range.start() > front_range.end() { - deque.push_front(new_elem); - } - } else { - deque.push_front(new_elem); - } - deque - }) - .into() -} +type Source<'a> = Cow<'a, str>; #[derive(Debug)] pub struct FixResult<'a> { @@ -68,37 +27,3 @@ impl<'a> FixResult<'a> { Self { src, fixed: Vec::new() } } } - -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 fixed = reordered - .iter() - .map(|r| Fixed { - at: r.range(), - code: r.code, - }) - .collect::>(); - for report in reordered { - report.apply(self.src.to_mut()); - } - - Some(FixResult { - src: self.src.clone(), - fixed - }) - } -} - -pub fn fix(src: &str) -> Option { - let src = Cow::from(src); - let _ = rnix::parse(&src).as_result().ok()?; - let initial = FixResult::empty(src); - initial.into_iter().last() -} -- cgit v1.2.3