perf: inline WiFi connect/hotspot args to eliminate Vec<String> allocation

This commit is contained in:
2026-03-31 23:38:57 +08:00
parent 2507629b4c
commit fbe064253c

View File

@@ -36,25 +36,6 @@ impl WifiPlugin {
Self { ctx: None } Self { ctx: None }
} }
fn build_connect_args(ssid: &str, password: &str) -> Vec<String> {
let mut args: Vec<String> = ["device", "wifi", "connect", ssid]
.into_iter()
.map(String::from)
.collect();
if !password.trim().is_empty() {
args.push("password".to_string());
args.push(password.to_string());
}
args
}
fn build_hotspot_args(ssid: &str, password: &str) -> Vec<String> {
["device", "wifi", "hotspot", "ssid", ssid, "password", password]
.into_iter()
.map(String::from)
.collect()
}
fn run_nmcli(args: &[impl AsRef<std::ffi::OsStr> + std::fmt::Debug]) -> Result<String> { fn run_nmcli(args: &[impl AsRef<std::ffi::OsStr> + std::fmt::Debug]) -> Result<String> {
let output = Command::new("nmcli") let output = Command::new("nmcli")
.args(args) .args(args)
@@ -189,7 +170,12 @@ impl WifiPlugin {
} }
fn connect_network(&self, ssid: &str, password: &str) -> Result<serde_json::Value> { fn connect_network(&self, ssid: &str, password: &str) -> Result<serde_json::Value> {
let output = Self::run_nmcli(&Self::build_connect_args(ssid, password))?; let mut args = vec!["device", "wifi", "connect", ssid];
if !password.trim().is_empty() {
args.push("password");
args.push(password);
}
let output = Self::run_nmcli(&args)?;
Ok(json!({ Ok(json!({
"ok": true, "ok": true,
@@ -260,7 +246,7 @@ impl WifiPlugin {
} }
fn ap_start(&self, ssid: &str, password: &str) -> Result<serde_json::Value> { fn ap_start(&self, ssid: &str, password: &str) -> Result<serde_json::Value> {
let output = Self::run_nmcli(&Self::build_hotspot_args(ssid, password))?; let output = Self::run_nmcli(&["device", "wifi", "hotspot", "ssid", ssid, "password", password])?;
Ok(json!({ Ok(json!({
"ok": true, "ok": true,
@@ -362,40 +348,4 @@ mod tests {
assert_eq!(fields, vec!["wlan0", "wifi", "connected", "Office:LAN"]); assert_eq!(fields, vec!["wlan0", "wifi", "connected", "Office:LAN"]);
} }
#[test]
fn connect_args_preserve_special_characters() {
let args =
WifiPlugin::build_connect_args(r#"ssid \"qa\" demo"#, r#"p@ss\\word with spaces"#);
assert_eq!(
args,
vec![
"device",
"wifi",
"connect",
r#"ssid \"qa\" demo"#,
"password",
r#"p@ss\\word with spaces"#,
]
);
}
#[test]
fn hotspot_args_preserve_special_characters() {
let args = WifiPlugin::build_hotspot_args("Showen AP", r#"\\quoted pass\\"#);
assert_eq!(
args,
vec![
"device",
"wifi",
"hotspot",
"ssid",
"Showen AP",
"password",
r#"\\quoted pass\\"#,
]
);
}
} }