use std::{env, error::Error, io, path::PathBuf};
use ferralk::{WalkOperation, Walker};
fn main() -> Result<(), Box<dyn Error>> {
let mut roots = env::args_os().skip(1).map(PathBuf::from);
let first = roots.next().unwrap_or_else(|| PathBuf::from("."));
let walker = Walker::new(first)
.add_roots(roots)?
.respect_git_ignore(true);
let result = walker.collect()?;
println!("{} entries", result.entries().len());
for error in result.errors() {
let kind = error
.source()
.and_then(|cause| cause.downcast_ref::<io::Error>())
.map(io::Error::kind);
let advice = match (error.operation(), kind) {
(WalkOperation::ReadDir, Some(io::ErrorKind::NotFound)) => "does not exist",
(WalkOperation::ReadDir, Some(io::ErrorKind::PermissionDenied)) => "not permitted",
(WalkOperation::ReadIgnore, _) => "ignore rules skipped",
_ => "not walked",
};
let cause = error.source().map(ToString::to_string).unwrap_or_default();
eprintln!("{}: {advice} ({error}: {cause})", error.path().display());
}
if result.errors().is_empty() {
Ok(())
} else {
Err(format!("{} error(s)", result.errors().len()).into())
}
}