From 120d00558ebecd4a5fb25c68603d46f6e7b22d2b Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Tue, 22 Sep 2026 06:04:13 -0300 Subject: [PATCH] refactor(deep-link)!: return Error::Execute when an OS command fails to run (#3603) * refactor(deep-link)!: return Error::Execute when an OS command fails to run On Linux, `register`, `unregister` and `is_registered` now fail with the new `Error::Execute(command, io_error)` variant when `xdg-mime` or `update-desktop-database` cannot be spawned, instead of logging and returning the raw `Error::Io`. This is the change deferred to v3 in #2970. * docs(deep-link): unregister does not run OS commands --- .changes/deep-link-execute-error.md | 5 +++++ plugins/deep-link/src/error.rs | 14 ++++---------- plugins/deep-link/src/lib.rs | 8 +++----- 3 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 .changes/deep-link-execute-error.md diff --git a/.changes/deep-link-execute-error.md b/.changes/deep-link-execute-error.md new file mode 100644 index 000000000..dc32c6765 --- /dev/null +++ b/.changes/deep-link-execute-error.md @@ -0,0 +1,5 @@ +--- +"deep-link": major +--- + +**Breaking:** On Linux, failing to run `xdg-mime` or `update-desktop-database` in `register` and `is_registered` now returns the new `Error::Execute(command, io_error)` variant instead of logging the failure and returning the raw `Error::Io`. diff --git a/plugins/deep-link/src/error.rs b/plugins/deep-link/src/error.rs index 41eb764f1..1ef7aa6ba 100644 --- a/plugins/deep-link/src/error.rs +++ b/plugins/deep-link/src/error.rs @@ -23,21 +23,15 @@ pub enum Error { #[cfg(target_os = "linux")] #[error(transparent)] ParseIni(#[from] ini::ParseError), + /// Failed to run an OS command such as `xdg-mime` or `update-desktop-database`. + #[cfg(target_os = "linux")] + #[error("Failed to run OS command `{0}`: {1}")] + Execute(&'static str, #[source] std::io::Error), #[cfg(mobile)] #[error(transparent)] PluginInvoke(#[from] tauri::plugin::mobile::PluginInvokeError), } -// TODO(v3): change this into an error in v3, -// see . -#[inline] -#[cfg(target_os = "linux")] -pub(crate) fn inspect_command_error<'a>(command: &'a str) -> impl Fn(&std::io::Error) + 'a { - move |e| { - tracing::error!("Failed to run OS command `{command}`: {e}"); - } -} - impl Serialize for Error { fn serialize(&self, serializer: S) -> std::result::Result where diff --git a/plugins/deep-link/src/lib.rs b/plugins/deep-link/src/lib.rs index b60ca810f..574a79881 100644 --- a/plugins/deep-link/src/lib.rs +++ b/plugins/deep-link/src/lib.rs @@ -351,14 +351,12 @@ mod imp { Command::new("update-desktop-database") .arg(target) .status() - .inspect_err(crate::error::inspect_command_error( - "update-desktop-database", - ))?; + .map_err(|error| crate::Error::Execute("update-desktop-database", error))?; Command::new("xdg-mime") .args(["default", &file_name, mime_type.as_str()]) .status() - .inspect_err(crate::error::inspect_command_error("xdg-mime"))?; + .map_err(|error| crate::Error::Execute("xdg-mime", error))?; Ok(()) } @@ -463,7 +461,7 @@ mod imp { &format!("x-scheme-handler/{}", _protocol.as_ref()), ]) .output() - .inspect_err(crate::error::inspect_command_error("xdg-mime"))?; + .map_err(|error| crate::Error::Execute("xdg-mime", error))?; Ok(String::from_utf8_lossy(&output.stdout).contains(&file_name)) }