use crate::core::{Finding, Severity};
use super::UpgradeCheckArgs;
use anyhow::Result;
use colored::*;
pub fn run(args: &UpgradeCheckArgs) -> Result<()> {
eprintln!("{}", "⬆️ Forge Guard — Upgrade Check".bold());
let mut findings: Vec<Finding> = Vec::new();
if args.storage_collision {
eprintln!("\n🔍 Checking for storage collisions...");
findings.extend(check_storage_collisions(args)?);
}
if args.uups {
eprintln!("\n🔍 Checking UUPS upgrade path...");
findings.extend(check_uups(args)?);
}
eprintln!("\n🔍 Analyzing proxy configuration...");
findings.extend(check_proxy_config(args)?);
if findings.is_empty() {
println!("\n{} No upgrade issues found!", "✅".green().bold());
} else {
println!(
"\n{} {} upgrade-related issues found:",
"⚠️".yellow().bold(),
findings.len()
);
for f in &findings {
let color = if f.severity >= Severity::High {
"red"
} else {
"yellow"
};
println!(
"\n [{}] {}",
f.severity.to_string().color(color).bold(),
f.title.bold()
);
println!(" {}", f.description);
println!(" 💡 {}", f.recommendation);
}
}
if args.shared.json {
println!("{}", serde_json::to_string_pretty(&findings)?);
}
Ok(())
}
fn check_storage_collisions(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
Ok(Vec::new())
}
fn check_uups(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
Ok(Vec::new())
}
fn check_proxy_config(_args: &UpgradeCheckArgs) -> Result<Vec<Finding>> {
Ok(Vec::new())
}