use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, Manager, Runtime, }; use tokio::sync::Mutex; mod commands; mod config; mod error; mod updater; pub use config::Config; pub use error::Error; pub use updater::*; pub type Result = std::result::Result; struct UpdaterState { target: Option, config: Config, } struct PendingUpdate(Mutex>>); #[derive(Default)] pub struct Builder { target: Option, installer_args: Option>, } /// Extension trait to use the updater on [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`]. pub trait UpdaterExt { /// Gets the updater builder to manually check if an update is available. /// /// # Examples /// /// ```no_run /// use tauri_plugin_updater::UpdaterExt; /// tauri::Builder::default() /// .setup(|app| { /// let handle = app.handle(); /// tauri::async_runtime::spawn(async move { /// let response = handle.updater().check().await; /// }); /// Ok(()) /// }); /// ``` fn updater(&self) -> updater::UpdateBuilder; } impl> UpdaterExt for T { fn updater(&self) -> updater::UpdateBuilder { updater::builder(self.app_handle()) } } impl Builder { pub fn new() -> Self { Self::default() } pub fn target(mut self, target: impl Into) -> Self { self.target.replace(target.into()); self } pub fn installer_args(mut self, args: I) -> Self where I: IntoIterator, S: Into, { self.installer_args .replace(args.into_iter().map(Into::into).collect()); self } pub fn build(self) -> TauriPlugin { let target = self.target; let installer_args = self.installer_args; PluginBuilder::::new("updater") .setup(move |app, api| { let mut config = api.config().clone(); if let Some(installer_args) = installer_args { config.installer_args = installer_args; } app.manage(UpdaterState { target, config }); app.manage(PendingUpdate::(Default::default())); Ok(()) }) .invoke_handler(tauri::generate_handler![ commands::check, commands::download_and_install ]) .build() } }