use clap::Parser;
use std::process;
use std::sync::Arc;
use sys_shred::cli::Args;
use sys_shred::core::Shredder;
fn main() {
env_logger::init();
let args = Args::parse();
let shredder = match Shredder::new(
args.method,
args.passes,
args.dry_run,
args.verify,
args.trim,
args.force,
&args.exclude,
!args.verbose,
) {
Ok(s) => Arc::new(s),
Err(e) => {
eprintln!("\x1b[31m[ERROR]\x1b[0m Configuration failed: {}", e);
process::exit(1);
}
};
let s_clone = Arc::clone(&shredder);
if let Err(e) = ctrlc::set_handler(move || {
eprintln!("\n\x1b[33m[WARN]\x1b[0m Interruption signal received. Cleaning up and exiting safely...");
s_clone.cancel();
}) {
eprintln!("\x1b[33m[WARN]\x1b[0m Failed to set signal handler: {}", e);
}
let shred_res = shredder.shred(&args.path, args.recursive, args.keep);
if let Some(log_path) = args.audit_log {
let report = shredder.generate_report();
if let Err(e) = report.save(&log_path, args.audit_format) {
eprintln!("\x1b[33m[WARN]\x1b[0m Failed to save audit log: {}", e);
} else {
println!(
"\x1b[34m[INFO]\x1b[0m Forensic audit log generated at: {:?}",
log_path
);
}
}
if let Err(e) = shred_res {
eprintln!("\n\x1b[31m[CRITICAL ERROR]\x1b[0m {}", e);
process::exit(1);
}
println!("\x1b[32m[SUCCESS]\x1b[0m File destruction sequence finalized.");
}