diff options
Diffstat (limited to 'src/tasks/client.rs')
| -rw-r--r-- | src/tasks/client.rs | 138 |
1 files changed, 98 insertions, 40 deletions
diff --git a/src/tasks/client.rs b/src/tasks/client.rs index 6561efd..baadfec 100644 --- a/src/tasks/client.rs +++ b/src/tasks/client.rs @@ -15,12 +15,35 @@ pub enum Name { impl Display for Name { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{:?}", self) + write!( + f, + "{:?}", + self + ) } } -pub const TASKS: &[Task] = &[Task(BaseTask { name: Name::Nop, exec: no_op }), Task(BaseTask { name: Name::Exec, exec: exec }), NETWORK_T]; -pub const NETWORK_T: Task = Task(BaseTask { name: Name::Network, exec: network }); +pub const TASKS: &[Task] = &[ + Task( + BaseTask { + name: Name::Nop, + exec: no_op, + }, + ), + Task( + BaseTask { + name: Name::Exec, + exec: exec, + }, + ), + NETWORK_T, +]; +pub const NETWORK_T: Task = Task( + BaseTask { + name: Name::Network, + exec: network, + }, +); fn no_op(_: &[&str], _: &()) -> Result<String, String> { Ok("".to_string()) @@ -30,9 +53,14 @@ fn exec(cmds: &[&str], _: &()) -> Result<String, String> { use std::process::Command; // TODO: fmt and add exit code, and add support for both stdout and stderr, and // support for no output - match Command::new(cmds[0]).args(&cmds[1..]).output() { + match Command::new(cmds[0]) + .args(&cmds[1..]) + .output() + { Ok(o) => { - if o.status.success() { + if o.status + .success() + { Ok(String::from_utf8_lossy(&o.stdout).to_string()) } else { Err(String::from_utf8_lossy(&o.stderr).to_string()) @@ -44,7 +72,9 @@ fn exec(cmds: &[&str], _: &()) -> Result<String, String> { fn network(switch: &[&str], _: &()) -> Result<String, String> { use std::process::{Command, Stdio}; - let switch: bool = switch[0].parse::<bool>().map_err(|e| e.to_string())?; + let switch: bool = switch[0] + .parse::<bool>() + .map_err(|e| e.to_string())?; // TODO: windows and linux @@ -52,52 +82,70 @@ fn network(switch: &[&str], _: &()) -> Result<String, String> { #[cfg(target_os = "macos")] { use std::io::Read; - match Command::new("networksetup").arg("-listallhardwareports").stdout(Stdio::piped()).spawn() { + match Command::new("networksetup") + .arg("-listallhardwareports") + .stdout(Stdio::piped()) + .spawn() + { Ok(devs) => { match Command::new("awk") .arg(r#"/Wi-Fi|AirPort/{getline; print $2}"#) - .stdin(Stdio::from(match devs.stdout { - Some(s) => s, - None => match devs.stderr { - Some(mut e) => { - let mut reason = String::new(); - if let Err(e) = e.read_to_string(&mut reason) { - return Err(format!("networksetup failed to list hardware: {e}")); - } - return Err(format!("networksetup failed to list hardware: {reason}")); - } - None => Err("networksetup failed to list hardware".to_string())?, - }, - })) + .stdin( + Stdio::from( + match devs.stdout { + Some(s) => s, + None => match devs.stderr { + Some(mut e) => { + let mut reason = String::new(); + if let Err(e) = e.read_to_string(&mut reason) { + return Err(format!("networksetup failed to list hardware: {e}")); + } + return Err(format!("networksetup failed to list hardware: {reason}")); + } + None => Err("networksetup failed to list hardware".to_string())?, + }, + }, + ), + ) .stdout(Stdio::piped()) .spawn() { Ok(dev) => match Command::new("networksetup") .arg("-setairportpower") - .arg(match dev.stdout { - Some(mut o) => { - let mut output = String::new(); - if let Err(e) = o.read_to_string(&mut output) { - return Err(format!("awk failed to get device from networksetup list hardware: {e}")); - }; - output - } - None => match dev.stderr { - Some(mut e) => { - let mut reason = String::new(); - if let Err(e) = e.read_to_string(&mut reason) { + .arg( + match dev.stdout { + Some(mut o) => { + let mut output = String::new(); + if let Err(e) = o.read_to_string(&mut output) { return Err(format!("awk failed to get device from networksetup list hardware: {e}")); - } - return Err(format!("awk failed to get device from networksetup list hardware: {reason}")); + }; + output } - None => Err("awk failed to get device from networksetup list hardware".to_string())?, + None => match dev.stderr { + Some(mut e) => { + let mut reason = String::new(); + if let Err(e) = e.read_to_string(&mut reason) { + return Err(format!("awk failed to get device from networksetup list hardware: {e}")); + } + return Err(format!("awk failed to get device from networksetup list hardware: {reason}")); + } + None => Err("awk failed to get device from networksetup list hardware".to_string())?, + }, + }, + ) + .arg( + if switch { + "on" + } else { + "off" }, - }) - .arg(if switch { "on" } else { "off" }) + ) .output() { Ok(o) => { - if o.status.success() { + if o.status + .success() + { Ok(String::from_utf8_lossy(&o.stdout).to_string()) } else { Err(String::from_utf8_lossy(&o.stderr).to_string()) @@ -121,7 +169,12 @@ impl TryFrom<&str> for &'static Task { fn try_from(value: &str) -> Result<Self, Self::Error> { for task in TASKS { - if task.0.name.to_string() == value { + if task + .0 + .name + .to_string() + == value + { return Ok(task); } } @@ -135,7 +188,12 @@ impl TryFrom<&str> for Task { fn try_from(value: &str) -> Result<Self, Self::Error> { for task in TASKS { - if task.0.name.to_string() == value { + if task + .0 + .name + .to_string() + == value + { return Ok(*task); } } |
