nmwrap 0.1.0

An interactive terminal user interface (TUI) written in Rust and Ratatui for scanning and managing Wi-Fi connections using nmcli
#![allow(unused)]
use std::{collections::HashSet, process::Command};

#[derive(Debug, Default, Clone)]
struct Wifi {
    list: Vec<String>,
    security: Vec<String>,
    in_use: Option<String>,
}

impl Wifi {
    fn set_in_use(&mut self, wifi: String) {
        self.in_use = Some(wifi);
    }

    fn get_list(&self) -> &[String] {
        &self.list
    }

    fn get_security(&self) -> &[String] {
        &self.security
    }

    fn get_used(&self) -> Option<&String> {
        self.in_use.as_ref()
    }
}

fn get_wifi_list() -> Option<Wifi> {
    let output = Command::new("nmcli")
        .args(["-t", "-f", "active,ssid,security", "dev", "wifi"])
        .output()
        .ok()?;

    if !output.status.success() {
        return None;
    }

    let stdout = String::from_utf8_lossy(&output.stdout);

    let mut wifi = Wifi::default();

    let mut seen = HashSet::new();
    let mut wifi_list = Vec::new();
    let mut security_list = Vec::new();

    for line in stdout.lines() {
        let mut parts = line.splitn(3, ':');

        let active = parts.next().unwrap_or("");
        let ssid = parts.next().unwrap_or("").trim();
        let security = parts.next().unwrap_or("").trim();

        if ssid.is_empty() {
            continue;
        }

        let ssid = ssid.to_string();

        if active == "yes" {
            wifi.set_in_use(ssid.clone());
        }

        if seen.insert(ssid.clone()) {
            wifi_list.push(ssid);
            security_list.push(security.to_string());
        }
    }

    wifi.list = wifi_list;
    wifi.security = security_list;

    Some(wifi)
}