agentswap 0.1.0

AgentSwap CLI — AI-agent-optimized DEX aggregator
// Sync status command for per-chain freshness and pool-grade snapshots.
// Exports: run.
// Deps: crate::{client, display}, comfy-table, eyre, serde_json.

use comfy_table::{presets::UTF8_FULL_CONDENSED, Table};
use eyre::Result;
use crate::client::Client;
use crate::display::format_duration;

pub async fn run(client: &Client, json: bool) -> Result<()> {
    let resp = client.health().await?;

    if json {
        println!("{}", serde_json::to_string_pretty(&resp)?);
        return Ok(());
    }

    let status = resp["status"].as_str().unwrap_or("unknown");
    let version = resp["version"].as_str().unwrap_or("?");
    let uptime = resp["uptime_secs"].as_u64().unwrap_or(0);
    let max_lag = resp["sync"]["max_lag_ms"].as_u64().unwrap_or(0);

    println!(
        "Status: {}  Version: {}  Uptime: {}  Max Lag: {}ms",
        status,
        version,
        format_duration(uptime),
        max_lag
    );
    println!();

    if let Some(grades) = resp["grades"].as_array() {
        let mut table = Table::new();
        table.load_preset(UTF8_FULL_CONDENSED);
        table.set_header(vec!["Chain", "Total", "A", "B", "C", "D", "E", "F"]);

        for grade in grades {
            let chain_id = grade["chain_id"].as_u64().unwrap_or(0);
            let total = grade["total"].as_u64().unwrap_or(0);
            let a = grade["A"].as_u64().unwrap_or(0);
            let b = grade["B"].as_u64().unwrap_or(0);
            let c = grade["C"].as_u64().unwrap_or(0);
            let d = grade["D"].as_u64().unwrap_or(0);
            let e = grade["E"].as_u64().unwrap_or(0);
            let f = grade["F"].as_u64().unwrap_or(0);
            table.add_row(vec![
                &chain_id.to_string(),
                &total.to_string(),
                &a.to_string(),
                &b.to_string(),
                &c.to_string(),
                &d.to_string(),
                &e.to_string(),
                &f.to_string(),
            ]);
        }

        println!("{table}");
    }

    Ok(())
}