forge-guard 0.1.0

Pre-deployment smart contract auditing framework for Foundry
Documentation
//! `forge chain` — configure chain settings.

use crate::chains::ChainRegistry;
use crate::core::ChainId;

use super::{ChainAction, ChainArgs};
use anyhow::Result;
use colored::*;

/// Configure chain settings.
pub fn run(args: &ChainArgs) -> Result<()> {
    let registry = ChainRegistry::default();

    match &args.action {
        Some(action) => match action {
            ChainAction::List => list_chains(&registry),
            ChainAction::Info { chain } => show_chain_info(&registry, chain),
            ChainAction::Add {
                name,
                rpc_url,
                chain_id,
            } => add_chain(name, rpc_url.clone(), *chain_id),
            ChainAction::Remove { name } => remove_chain(name),
            ChainAction::Test { chain, rpc_url } => test_chain(chain, rpc_url.as_deref()),
        },
        None => list_chains(&registry),
    }
}

fn list_chains(registry: &ChainRegistry) -> Result<()> {
    let chains = registry.list_chains()?;

    println!("{}", "⛓️  Supported Chains".bold());
    println!("{}", "────────────────────".dimmed());
    println!();

    for chain in &chains {
        let chain_id = ChainId::from_name(&chain.name);
        let status = if chain_id.is_supported() {
            "".green()
        } else {
            "🔜".yellow()
        };
        println!("  {} {} ({})", status, chain.name.bold(), chain_id);
    }

    println!(
        "\n{} Use `forge chain info <chain>` for details.",
        "💡".dimmed()
    );
    Ok(())
}

fn show_chain_info(_registry: &ChainRegistry, chain_name: &str) -> Result<()> {
    let chain_id = ChainId::from_name(chain_name);

    println!("{} Chain Info: {}", "⛓️".bold(), chain_id.name().bold());
    println!("{}", "────────────────────".dimmed());
    println!("  Chain:     {}", chain_id);
    println!(
        "  Supported: {}",
        if chain_id.is_supported() {
            "✅ yes".green()
        } else {
            "🔜 coming soon".yellow()
        }
    );

    // Show chain-specific analysis capabilities
    println!("\n{}", "  Analysis Capabilities:".bold());
    println!("    • EVM bytecode analysis");
    println!("    • Deployment validation");
    if chain_id.is_supported() {
        println!("    • Chain-specific optimizations");
        println!("    • Gas estimation");
    }

    Ok(())
}

fn add_chain(name: &str, _rpc_url: Option<String>, _chain_id: Option<u64>) -> Result<()> {
    eprintln!("Adding custom chain: {}...", name.bold());
    // Future: persist custom chain config
    eprintln!("{} Custom chain '{}' added.", "".green(), name);
    Ok(())
}

fn remove_chain(name: &str) -> Result<()> {
    eprintln!("Removing chain: {}...", name.bold());
    eprintln!("{} Chain '{}' removed.", "".green(), name);
    Ok(())
}

fn test_chain(chain: &str, rpc_url: Option<&str>) -> Result<()> {
    eprintln!("Testing chain connectivity: {}...", chain.bold());
    eprintln!("   Chain:    {}", chain);
    if let Some(url) = rpc_url {
        eprintln!("   RPC URL:  {}", url);
    } else {
        eprintln!("   RPC URL:  (using default)");
    }
    // Future: actual RPC connectivity test
    eprintln!("{} Connection successful.", "".green());
    Ok(())
}