diff options
Diffstat (limited to 'pkgs/by-name/ts/tskm/src/browser/mod.rs')
| -rw-r--r-- | pkgs/by-name/ts/tskm/src/browser/mod.rs | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/pkgs/by-name/ts/tskm/src/browser/mod.rs b/pkgs/by-name/ts/tskm/src/browser/mod.rs index 29abfcbd..2129982f 100644 --- a/pkgs/by-name/ts/tskm/src/browser/mod.rs +++ b/pkgs/by-name/ts/tskm/src/browser/mod.rs @@ -1,5 +1,5 @@ use std::{ - env, + env, fs, io::Write, os::unix::net::UnixStream, path::PathBuf, @@ -14,11 +14,14 @@ use url::Url; use crate::{state::State, task}; #[allow(clippy::too_many_lines)] -pub fn open_in_browser( +pub fn open_in_browser<U>( selected_project: &task::Project, state: &mut State, - urls: Option<Vec<Url>>, -) -> Result<()> { + urls: Option<Vec<U>>, +) -> Result<()> +where + U: Into<Url>, +{ let old_project: Option<task::Project> = task::Project::get_current().context("Failed to get currently active project")?; let old_task: Option<task::Task> = @@ -101,11 +104,35 @@ pub fn open_in_browser( ) })); - if ipc_socket_path.exists() { - let mut stream = UnixStream::connect(ipc_socket_path)?; + let socket = if ipc_socket_path.exists() { + match UnixStream::connect(&ipc_socket_path) { + Ok(ok) => Some(ok), + Err(err) => match err.kind() { + std::io::ErrorKind::ConnectionRefused => { + // There is no qutebrowser listening to our connection. + fs::remove_file(&ipc_socket_path).with_context(|| { + format!( + "Failed to remove orphaned qutebrowser socket: {}", + ipc_socket_path.display() + ) + })?; + None + } + _ => Err(err).with_context(|| { + format!( + "Failed to connect to qutebrowser's ipc socket at: {}", + ipc_socket_path.display() + ) + })?, + }, + } + } else { + None + }; + if let Some(mut stream) = socket { let real_url = if let Some(urls) = urls { - urls.into_iter().map(|url| url.to_string()).collect() + urls.into_iter().map(|url| url.into().to_string()).collect() } else { // Always add a new tab, so that qutebrowser is marked as “urgent”. vec!["qute://start".to_owned()] @@ -129,7 +156,10 @@ pub fn open_in_browser( ExitStatus::default() } else { let args = if let Some(urls) = urls { - urls.iter().map(|url| url.to_string()).collect() + urls.into_iter() + .map(Into::<Url>::into) + .map(|u| u.to_string()) + .collect() } else { vec![] }; |
