use std::env;
use std::process::ExitCode;
use scankit::{ScanConfig, ScanEvent, Scanner};
fn main() -> ExitCode {
let Some(root) = env::args().nth(1) else {
eprintln!("usage: watch <path>");
eprintln!();
eprintln!("Builds with --features watch.");
return ExitCode::FAILURE;
};
let config = ScanConfig::default()
.max_file_size_bytes(50 * 1024 * 1024)
.add_exclude("**/.git/**")
.and_then(|c| c.add_exclude("**/node_modules/**"))
.and_then(|c| c.add_exclude("**/.DS_Store"))
.and_then(|c| c.add_exclude("**/target/**"));
let config = match config {
Ok(c) => c,
Err(e) => {
eprintln!("config error: {e}");
return ExitCode::FAILURE;
}
};
let scanner = match Scanner::new(config) {
Ok(s) => s,
Err(e) => {
eprintln!("scanner error: {e}");
return ExitCode::FAILURE;
}
};
let stream = match scanner.scan(&root) {
Ok(s) => s,
Err(e) => {
eprintln!("watch error: {e}");
return ExitCode::FAILURE;
}
};
eprintln!("watching {root}; Ctrl-C to stop");
eprintln!();
for event in stream {
match event {
ScanEvent::Initial(entry) => {
println!("[init] {}", entry.path.display());
}
ScanEvent::InitialComplete => {
println!();
println!("=== initial walk complete; now watching live ===");
println!();
}
ScanEvent::Created(entry) => {
println!("[created] {}", entry.path.display());
}
ScanEvent::Modified(entry) => {
println!("[mod] {}", entry.path.display());
}
ScanEvent::Deleted(path) => {
println!("[deleted] {}", path.display());
}
other => {
println!("[other] {other:?}");
}
}
}
ExitCode::SUCCESS
}