use super::FuzzArgs;
use anyhow::{Context, Result};
use colored::*;
pub fn run(args: &FuzzArgs) -> Result<()> {
eprintln!("{}", "🎯 Forge Guard — Fuzzing Campaign".bold());
eprintln!(" Runs: {}", args.runs);
eprintln!(
" Seed: {}",
args.seed.map_or("random".into(), |s| s.to_string())
);
eprintln!(" Contract: {}", args.contract.as_deref().unwrap_or("all"));
let mut cmd = std::process::Command::new("forge");
cmd.arg("test");
cmd.arg("--fuzz-runs").arg(args.runs.to_string());
if let Some(seed) = args.seed {
cmd.arg("--fuzz-seed").arg(seed.to_string());
}
if let Some(test) = &args.test {
cmd.arg("--match-test").arg(test);
}
if let Some(contract) = &args.contract {
cmd.arg("--match-contract").arg(contract);
}
eprintln!("\n🚀 Running fuzzing campaign...\n");
let status = cmd.status().context("Failed to run forge test")?;
if !status.success() {
anyhow::bail!("Fuzzing found issues — inspect output above");
}
eprintln!(
"\n{}",
"✅ Fuzzing passed — no issues found.".green().bold()
);
Ok(())
}