framesmith-cli 0.1.0

CLI tool for controlling Samsung Frame TVs over the local network
use anyhow::{Context, Result};

pub async fn run(json: bool) -> Result<()> {
    let tvs = framesmith::discover().await.context("discovery failed")?;

    if json {
        let items: Vec<serde_json::Value> = tvs
            .iter()
            .map(|tv| {
                serde_json::json!({
                    "name": tv.name(),
                    "ip": tv.ip().to_string(),
                    "model": tv.model(),
                })
            })
            .collect();
        println!("{}", serde_json::to_string_pretty(&items)?);
    } else if tvs.is_empty() {
        println!("No Samsung Frame TVs found on the network.");
    } else {
        // Print a simple table
        let name_w = tvs.iter().map(|t| t.name().len()).max().unwrap_or(4).max(4);
        let ip_w = tvs
            .iter()
            .map(|t| t.ip().to_string().len())
            .max()
            .unwrap_or(2)
            .max(2);
        println!("{:<name_w$}  {:<ip_w$}  MODEL", "NAME", "IP",);
        for tv in &tvs {
            println!("{:<name_w$}  {:<ip_w$}  {}", tv.name(), tv.ip(), tv.model(),);
        }
    }

    Ok(())
}