extern crate ress;
extern crate walkdir;
use ress::prelude::*;
use walkdir::WalkDir;
use std::{collections::HashMap, env::args, fs::read_to_string, path::PathBuf};
fn main() {
let mut args = args();
let _ = args.next();
let start = args
.next()
.expect("No directory provided as starting location.");
let issues = check_files(start);
if issues.is_empty() {
println!("Good to go, no semicolons found");
} else {
for (path, indexes) in issues {
println!("Issues found in {:?} at indexes:", path);
println!("\t{:?}\n", indexes)
}
}
}
fn check_files(start: String) -> HashMap<PathBuf, Vec<usize>> {
let mut ret: HashMap<PathBuf, Vec<usize>> = HashMap::new();
for entry in WalkDir::new(start).min_depth(1) {
match entry {
Ok(entry) => {
let path = entry.path();
if path.extension() == Some(::std::ffi::OsStr::new("js")) {
if let Ok(js) = read_to_string(path) {
let indexes = check_js(&js);
if !indexes.is_empty() {
ret.insert(path.to_path_buf(), indexes);
}
}
}
}
Err(e) => eprintln!("failed to get a directory entry: {:?}", e),
}
}
ret
}
fn check_js(js: &str) -> Vec<usize> {
Scanner::new(js)
.filter_map(|item| {
let item = item.unwrap();
if let Token::Punct(ref inner) = item.token {
match inner {
Punct::SemiColon => Some(item.span.start),
_ => None,
}
} else {
None
}
})
.collect()
}