nm-wifi 0.3.0

A Terminal User Interface for managing Wi-Fi connections on Linux
Documentation
use std::{error::Error, fs, io, path::Path};

use super::{
    render::render_app,
    scenarios::demo_shot_apps,
    svg::buffer_to_svg,
};
use crate::{backend::NetworkBackend, wifi::WifiNetwork};

fn validate_demo_screenshot_networks(
    networks: &[WifiNetwork],
) -> Result<(), Box<dyn Error>> {
    if networks.is_empty() {
        return Err(io::Error::other(
            "demo screenshots require at least one network",
        )
        .into());
    }

    if !networks.iter().any(|network| network.connected) {
        return Err(io::Error::other(
            "demo screenshots require at least one connected network",
        )
        .into());
    }

    if !networks.iter().any(|network| !network.connected) {
        return Err(io::Error::other(
            "demo screenshots require at least one unconnected network",
        )
        .into());
    }

    if !networks
        .iter()
        .any(|network| network.is_secured() && !network.connected)
    {
        return Err(io::Error::other(
            "demo screenshots require at least one secured unconnected network",
        )
        .into());
    }

    Ok(())
}

pub fn write_demo_svgs(
    output_dir: &Path,
    networks: &[WifiNetwork],
) -> Result<(), Box<dyn Error>> {
    validate_demo_screenshot_networks(networks)?;
    fs::create_dir_all(output_dir)?;

    for (file_name, app) in demo_shot_apps(networks) {
        let buffer = render_app(&app)?;
        let svg = buffer_to_svg(&buffer);
        fs::write(output_dir.join(file_name), svg)?;
    }

    Ok(())
}

pub async fn write_demo_svgs_with_backend(
    output_dir: &Path,
    backend: &dyn NetworkBackend,
) -> Result<(), Box<dyn Error>> {
    let networks = backend.scan_networks().await?;
    write_demo_svgs(output_dir, &networks)
}