use clap::Parser;
use std::process;
use std::sync::Arc;
use sys_shred::cli::Args;
use sys_shred::core::Shredder;
use sys_shred::ui::UI;
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) => {
UI.error(format!("Configuration failed: {}", e));
process::exit(1);
}
};
let s_clone = Arc::clone(&shredder);
if let Err(e) = ctrlc::set_handler(move || {
eprintln!();
UI.warn("Interruption signal received. Cleaning up safely...");
s_clone.cancel();
}) {
UI.warn(format!("Failed to set signal handler: {}", e));
}
let start_time = std::time::Instant::now();
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) {
UI.warn(format!("Failed to save audit log: {}", e));
} else {
UI.info(
"Report",
format!("Forensic audit log generated at: {:?}", log_path),
);
}
}
if let Err(e) = shred_res {
eprintln!();
UI.error(format!("{}", e));
process::exit(1);
}
let duration = start_time.elapsed();
UI.finished(format!("shredding completed in {:.2?}", duration));
}