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(())
}