routerctl 0.3.6

Command-line control interface for syntrop-routerd
use crate::cli::InfoArgs;
use crate::client::RouterctlClient;
use anyhow::Result;
use colored::Colorize;

pub async fn run_info(
    client: &RouterctlClient,
    args: InfoArgs,
    json_output: bool,
) -> Result<()> {
    if let Some(iface) = args.interface {
        let idl = client.get_interface_description(&iface).await?;
        if json_output {
            let obj = serde_json::json!({
                "interface": iface,
                "idl": idl
            });
            println!("{}", serde_json::to_string_pretty(&obj)?);
        } else {
            println!("{}", format!("=== Interface: {} ===", iface).bold().cyan());
            println!("{}", idl);
        }
    } else {
        let info = client.get_info().await?;
        if json_output {
            println!("{}", serde_json::to_string_pretty(&info)?);
        } else {
            println!("{}", "=== Varlink Service Info ===".bold().cyan());
            let vendor = info.get("vendor").and_then(|v| v.as_str()).unwrap_or("");
            let product = info.get("product").and_then(|v| v.as_str()).unwrap_or("");
            let version = info.get("version").and_then(|v| v.as_str()).unwrap_or("");
            let url = info.get("url").and_then(|v| v.as_str()).unwrap_or("");
            let ifaces = info
                .get("interfaces")
                .and_then(|i| i.as_array())
                .cloned()
                .unwrap_or_default();

            println!("  {:<16} {}", "Vendor:".bold(), vendor);
            println!("  {:<16} {}", "Product:".bold(), product);
            println!("  {:<16} {}", "Version:".bold(), version);
            println!("  {:<16} {}", "URL:".bold(), url);
            println!("  {:<16}", "Interfaces:".bold());
            for iface in ifaces {
                if let Some(name) = iface.as_str() {
                    println!("    - {}", name.green());
                }
            }
        }
    }

    Ok(())
}