use regex::Regex;
use std::sync::LazyLock;
use super::credentials::{ WifiCredentials, WifiSecurity };
static WIFI_REGEX: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(
r"^WIFI:T:(?P<wifi_type>[^;]+);S:(?P<wifi_ssid>[^;]+);(?:P:(?P<wifi_pwd>[^;]*);)?.*$" ).unwrap()
});
pub fn parse_wifi_credentials(qr_payloads: &[String]) -> Option<WifiCredentials> {
for payload in qr_payloads {
if let Some(caps) = WIFI_REGEX.captures(payload) {
let ssid = caps["wifi_ssid"].to_string();
let raw_security_type = caps["wifi_type"].to_string(); let security_type = match raw_security_type.as_str() {
"WPA" | "WPA2" | "WPA3" => WifiSecurity::Wpa,
"WEP" => WifiSecurity::Wep,
"nopass" | "" => WifiSecurity::Open,
_ => {
continue;
}
};
let password_text = caps .name("wifi_pwd") .map(|m| m.as_str().to_string()) .unwrap_or_default(); let password = match security_type {
WifiSecurity::Wpa | WifiSecurity::Wep => {
if password_text.is_empty() {
continue;
}
Some(password_text)
}
WifiSecurity::Open => None,
};
return Some(WifiCredentials { security_type, ssid, password });
} else {
println!("Regex did not match.");
}
}
None
}