diff --git a/opener/src/linux_and_more.rs b/opener/src/linux_and_more.rs index f68141c..489dab9 100644 --- a/opener/src/linux_and_more.rs +++ b/opener/src/linux_and_more.rs @@ -1,7 +1,8 @@ use crate::OpenError; use std::ffi::OsStr; +use std::io; use std::io::Write; -use std::process::{Command, Stdio}; +use std::process::{Child, Command, Stdio}; const XDG_OPEN_SCRIPT: &[u8] = include_bytes!("xdg-open"); @@ -14,66 +15,28 @@ pub(crate) fn open(path: &OsStr) -> Result<(), OpenError> { } fn wsl_open(path: &OsStr) -> Result<(), OpenError> { - let transformed_path = crate::wsl_to_windows_path(path); - let transformed_path = transformed_path.as_deref(); - let path = match transformed_path { - None => path, - Some(x) => x, - }; - let wslview = Command::new("wslview") - .arg(path) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::piped()) - .spawn(); - - if let Ok(mut child) = wslview { + let result = open_with_wslview(path); + if let Ok(mut child) = result { return crate::wait_child(&mut child, "wslview".into()); } - let mut system_xdg_open = Command::new("xdg-open") - .arg(path) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::piped()) - .spawn() - .map_err(OpenError::Io)?; - + let mut system_xdg_open = open_with_system_xdg_open(path).map_err(OpenError::Io)?; crate::wait_child(&mut system_xdg_open, "xdg-open (system)".into()) } fn non_wsl_open(path: &OsStr) -> Result<(), OpenError> { - let system_xdg_open = Command::new("xdg-open") - .arg(path) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::piped()) - .spawn(); + let system_xdg_open = open_with_system_xdg_open(path); let system_xdg_open_used; - let mut xdg_open = match system_xdg_open { + let mut xdg_open; + match system_xdg_open { Ok(child) => { system_xdg_open_used = true; - child + xdg_open = child; } Err(_) => { system_xdg_open_used = false; - let mut sh = Command::new("sh") - .arg("-s") - .arg(path) - .stdin(Stdio::piped()) - .stdout(Stdio::null()) - .stderr(Stdio::piped()) - .spawn() - .map_err(OpenError::Io)?; - - sh.stdin - .as_mut() - .unwrap() - .write_all(XDG_OPEN_SCRIPT) - .map_err(OpenError::Io)?; - - sh + xdg_open = open_with_internal_xdg_open(path)?; } }; @@ -85,3 +48,47 @@ fn non_wsl_open(path: &OsStr) -> Result<(), OpenError> { crate::wait_child(&mut xdg_open, cmd_name.into()) } + +fn open_with_wslview(path: &OsStr) -> io::Result { + let converted_path = crate::wsl_to_windows_path(path); + let converted_path = converted_path.as_deref(); + let path = match converted_path { + None => path, + Some(x) => x, + }; + + Command::new("wslview") + .arg(path) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn() +} + +fn open_with_system_xdg_open(path: &OsStr) -> io::Result { + Command::new("xdg-open") + .arg(path) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn() +} + +fn open_with_internal_xdg_open(path: &OsStr) -> Result { + let mut sh = Command::new("sh") + .arg("-s") + .arg(path) + .stdin(Stdio::piped()) + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn() + .map_err(OpenError::Io)?; + + sh.stdin + .as_mut() + .unwrap() + .write_all(XDG_OPEN_SCRIPT) + .map_err(OpenError::Io)?; + + Ok(sh) +}