diff --git a/mediarepo-api/Cargo.toml b/mediarepo-api/Cargo.toml index 41a3a71..2a06a8d 100644 --- a/mediarepo-api/Cargo.toml +++ b/mediarepo-api/Cargo.toml @@ -14,6 +14,7 @@ rmp-ipc = {version = "0.8.1", optional=true} parking_lot = {version="0.11.2", optional=true} serde_json = {version="1.0.68", optional=true} directories = {version="4.0.1", optional=true} +serde_piecewise_default = "0.2.0" [dependencies.serde] version = "1.0.130" diff --git a/mediarepo-api/src/daemon_management/cli.rs b/mediarepo-api/src/daemon_management/cli.rs index 215403f..e0baf9d 100644 --- a/mediarepo-api/src/daemon_management/cli.rs +++ b/mediarepo-api/src/daemon_management/cli.rs @@ -1,5 +1,6 @@ use crate::daemon_management::error::{DaemonError, DaemonResult}; use std::ffi::OsStr; +use std::mem; use tokio::process::{Child, Command}; #[derive(Debug)] @@ -38,6 +39,17 @@ impl DaemonCli { Ok(()) } + /// Kills the running daemon process if there's one associated with the + /// daemon cli + #[tracing::instrument] + pub async fn stop_daemon(&mut self) -> DaemonResult<()> { + if let Some(mut child) = mem::take(&mut self.child) { + child.kill().await?; + } + + Ok(()) + } + /// Returns if the daemon is currently running pub fn daemon_running(&mut self) -> bool { if let Some(child) = &mut self.child { @@ -76,6 +88,7 @@ impl DaemonCli { ) -> DaemonResult { Command::new(&self.daemon_path) .args(args) + .kill_on_drop(true) .spawn() .map_err(DaemonError::from) } diff --git a/mediarepo-api/src/tauri_plugin/commands/daemon.rs b/mediarepo-api/src/tauri_plugin/commands/daemon.rs index 2e90dfa..9a6d658 100644 --- a/mediarepo-api/src/tauri_plugin/commands/daemon.rs +++ b/mediarepo-api/src/tauri_plugin/commands/daemon.rs @@ -19,6 +19,13 @@ pub async fn start_daemon(app_state: AppAccess<'_>, repo_path: String) -> Plugin Ok(()) } +#[tauri::command] +pub async fn stop_daemon(app_state: AppAccess<'_>, repo_path: String) -> PluginResult<()> { + app_state.stop_running_daemon(&repo_path).await?; + + Ok(()) +} + #[tauri::command] pub async fn check_daemon_running(address: String) -> PluginResult { if let Ok(api_client) = ApiClient::connect(&address).await { diff --git a/mediarepo-api/src/tauri_plugin/mod.rs b/mediarepo-api/src/tauri_plugin/mod.rs index 5c13ce9..072107f 100644 --- a/mediarepo-api/src/tauri_plugin/mod.rs +++ b/mediarepo-api/src/tauri_plugin/mod.rs @@ -43,6 +43,7 @@ impl MediarepoPlugin { init_repository, start_daemon, check_daemon_running, + stop_daemon, ]), } } diff --git a/mediarepo-api/src/tauri_plugin/settings.rs b/mediarepo-api/src/tauri_plugin/settings.rs index 4c1addd..9fa128e 100644 --- a/mediarepo-api/src/tauri_plugin/settings.rs +++ b/mediarepo-api/src/tauri_plugin/settings.rs @@ -1,6 +1,7 @@ use crate::tauri_plugin::error::PluginResult; use directories::ProjectDirs; use serde::{Deserialize, Serialize}; +use serde_piecewise_default::DeserializePiecewiseDefault; use std::collections::HashMap; use std::fs; use std::path::PathBuf; @@ -14,7 +15,7 @@ pub struct Repository { pub(crate) address: String, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(DeserializePiecewiseDefault, Debug, Serialize)] pub struct Settings { pub daemon_path: String, pub repositories: HashMap, diff --git a/mediarepo-api/src/tauri_plugin/state.rs b/mediarepo-api/src/tauri_plugin/state.rs index 28bbb6e..489a24c 100644 --- a/mediarepo-api/src/tauri_plugin/state.rs +++ b/mediarepo-api/src/tauri_plugin/state.rs @@ -148,4 +148,15 @@ impl AppState { let mut daemons = self.running_daemons.write().await; daemons.insert(daemon.repo_path().to_owned(), daemon); } + + /// Tries to stop a running daemon + pub async fn stop_running_daemon(&self, repo_path: &String) -> PluginResult<()> { + let mut daemons = self.running_daemons.write().await; + + if let Some(mut daemon) = daemons.remove(repo_path) { + daemon.stop_daemon().await?; + } + + Ok(()) + } }