#![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)
}