use std::{env, error::Error, path::PathBuf};
use ferralk::{WalkOptions, Walker};
fn main() -> Result<(), Box<dyn Error>> {
let mut args = env::args().skip(1);
let root = args
.next()
.map_or_else(|| PathBuf::from("."), PathBuf::from);
let mut globs = args.collect::<Vec<_>>();
if globs.is_empty() {
globs = vec!["**/*.rs".to_owned(), "!**/target/**".to_owned()];
}
let mut walker = Walker::new(&root).options(WalkOptions::default().files_only(true).sort(true));
for glob in &globs {
let (pattern, added) = match glob.strip_prefix('!').filter(|rest| !rest.starts_with('(')) {
Some(excluded) => (excluded, walker.try_exclude(excluded).map(|_| ())),
None => (glob.as_str(), walker.try_include(glob).map(|_| ())),
};
if let Err(error) = added {
let column = pattern
.get(..error.offset())
.map_or(error.offset(), |before| before.chars().count());
let marker = " ".repeat(column);
eprintln!("skipping {glob:?}: {error}\n {pattern}\n {marker}^");
}
}
let result = walker.collect()?;
for entry in result.entries() {
println!("{}", entry.path().strip_prefix(entry.root())?.display());
}
for error in result.errors() {
match error.source() {
Some(cause) => eprintln!("warning: {error}: {cause}"),
None => eprintln!("warning: {error}"),
}
}
Ok(())
}