framesmith-cli 0.1.0

CLI tool for controlling Samsung Frame TVs over the local network
use std::net::IpAddr;

use anyhow::{Context, Result};

pub async fn run(host: &str, json: bool) -> Result<()> {
    let ip: IpAddr = host
        .parse()
        .with_context(|| format!("invalid IP address: {host}"))?;

    let info = framesmith::get_device_info(ip)
        .await
        .context("failed to get device info")?;

    if json {
        println!(
            "{}",
            serde_json::json!({
                "name": info.name(),
                "model": info.model(),
                "model_id": info.model_id(),
                "os": info.os(),
                "power_state": format!("{:?}", info.power_state()),
                "frame_tv_support": info.frame_tv_support(),
                "resolution": info.resolution(),
                "ip": info.ip(),
                "network_type": info.network_type(),
                "wifi_mac": info.wifi_mac(),
            })
        );
    } else {
        println!("Name:             {}", info.name());
        println!("Model:            {}", info.model());
        println!("Model ID:         {}", info.model_id());
        println!("OS:               {}", info.os());
        println!("Power state:      {:?}", info.power_state());
        println!("Frame TV support: {}", info.frame_tv_support());
        println!("Resolution:       {}", info.resolution());
        println!("IP:               {}", info.ip());
        println!("Network:          {}", info.network_type());
        println!("WiFi MAC:         {}", info.wifi_mac());
    }

    Ok(())
}