unifi-cli 0.2.2

CLI for UniFi Network controller
Documentation
use owo_colors::OwoColorize;

use crate::api::UnifiClient;
use crate::output::{OutputConfig, use_color};

pub async fn list(
    client: &mut UnifiClient,
    out: OutputConfig,
) -> Result<(), Box<dyn std::error::Error>> {
    let networks = client.list_networks().await?;

    if out.is_json() {
        out.print_data(&serde_json::to_string_pretty(
            &networks
                .iter()
                .map(|n| {
                    serde_json::json!({
                        "name": n.name,
                        "vlan_id": n.vlan_id,
                        "enabled": n.enabled,
                        "default": n.default,
                    })
                })
                .collect::<Vec<_>>(),
        )?);
        out.print_message(&format!("\n{} networks", networks.len()));
        return Ok(());
    }

    let color = use_color();
    let header = format!(
        "{:<30} {:<8} {:<10} {}",
        "Name", "VLAN", "Enabled", "Default"
    );
    if color {
        println!("{}", header.bold());
        println!("{}", "-".repeat(58).dimmed());
    } else {
        println!("{header}");
        println!("{}", "-".repeat(58));
    }

    for n in &networks {
        let name = n.name.as_deref().unwrap_or("-");
        let vlan = n
            .vlan_id
            .map(|v| v.to_string())
            .unwrap_or_else(|| "-".into());
        let enabled = if n.enabled { "yes" } else { "no" };
        let is_default = if n.default { "yes" } else { "no" };

        if color {
            println!(
                " {:<29} {:<8} {:<10} {}",
                name.bold(),
                vlan,
                enabled,
                is_default,
            );
        } else {
            println!(" {:<29} {:<8} {:<10} {}", name, vlan, enabled, is_default);
        }
    }

    out.print_message(&format!("\n{} networks", networks.len()));
    Ok(())
}