diff --git a/src/lib.rs b/src/lib.rs index 4dbd26e..f5045be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,8 +11,9 @@ html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png" )] -use std::ffi::OsString; +use std::{ffi::OsString, sync::Arc}; +use semver::Version; use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, Manager, Runtime, @@ -69,7 +70,11 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T { fn updater_builder(&self) -> UpdaterBuilder { let app = self.app_handle(); let package_info = app.package_info(); - let UpdaterState { config, target } = self.state::<UpdaterState>().inner(); + let UpdaterState { + config, + target, + version_comparator, + } = self.state::<UpdaterState>().inner(); let mut builder = UpdaterBuilder::new( package_info.name.clone(), @@ -86,6 +91,8 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T { builder = builder.current_exe_args(args); } + builder.version_comparator = version_comparator.clone(); + #[cfg(any( target_os = "linux", target_os = "dragonfly", @@ -116,6 +123,7 @@ impl<R: Runtime, T: Manager<R>> UpdaterExt<R> for T { struct UpdaterState { target: Option<String>, config: Config, + version_comparator: Option<VersionComparator>, } #[derive(Default)] @@ -123,6 +131,7 @@ pub struct Builder { target: Option<String>, pubkey: Option<String>, installer_args: Vec<OsString>, + default_version_comparator: Option<VersionComparator>, } impl Builder { @@ -163,9 +172,20 @@ impl Builder { self } + pub fn default_version_comparator< + F: Fn(Version, RemoteRelease) -> bool + Send + Sync + 'static, + >( + mut self, + f: F, + ) -> Self { + self.default_version_comparator.replace(Arc::new(f)); + self + } + pub fn build<R: Runtime>(self) -> TauriPlugin<R, Config> { let pubkey = self.pubkey; let target = self.target; + let version_comparator = self.default_version_comparator; let installer_args = self.installer_args; PluginBuilder::<R, Config>::new("updater") .setup(move |app, api| { @@ -176,7 +196,11 @@ impl Builder { if let Some(windows) = &mut config.windows { windows.installer_args.extend_from_slice(&installer_args); } - app.manage(UpdaterState { target, config }); + app.manage(UpdaterState { + target, + config, + version_comparator, + }); Ok(()) }) .invoke_handler(tauri::generate_handler![ diff --git a/src/updater.rs b/src/updater.rs index d66af3d..bb03e7e 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -93,12 +93,13 @@ impl RemoteRelease { } pub type OnBeforeExit = Arc<dyn Fn() + Send + Sync + 'static>; +pub type VersionComparator = Arc<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>; pub struct UpdaterBuilder { app_name: String, current_version: Version, config: Config, - version_comparator: Option<Box<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>>, + pub(crate) version_comparator: Option<VersionComparator>, executable_path: Option<PathBuf>, target: Option<String>, endpoints: Option<Vec<Url>>, @@ -139,7 +140,7 @@ impl UpdaterBuilder { mut self, f: F, ) -> Self { - self.version_comparator = Some(Box::new(f)); + self.version_comparator = Some(Arc::new(f)); self } @@ -283,7 +284,7 @@ pub struct Updater { config: Config, app_name: String, current_version: Version, - version_comparator: Option<Box<dyn Fn(Version, RemoteRelease) -> bool + Send + Sync>>, + version_comparator: Option<VersionComparator>, timeout: Option<Duration>, proxy: Option<Url>, endpoints: Vec<Url>,