diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 4a6174f..88b6978 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,6 +1,12 @@ use parking_lot::RwLock; +use tauri::AppHandle; -use crate::config::Config; +use crate::{ + config::Config, + errors::{CommandError, CommandResult}, + extensions::AppHandleExt, + logger, +}; #[tauri::command] #[specta::specta] @@ -14,3 +20,38 @@ pub fn greet(name: &str) -> String { pub fn get_config(config: tauri::State>) -> Config { config.read().clone() } + +#[tauri::command(async)] +#[specta::specta] +#[allow(clippy::needless_pass_by_value)] +pub fn save_config(app: AppHandle, config: Config) -> CommandResult<()> { + let config_state = app.get_config(); + + let enable_file_logger = config.enable_file_logger; + let enable_file_logger_changed = config_state + .read() + .enable_file_logger + .ne(&enable_file_logger); + + { + // 包裹在大括号中,以便自动释放写锁 + let mut config_state = config_state.write(); + *config_state = config; + config_state + .save(&app) + .map_err(|err| CommandError::from("保存配置失败", err))?; + tracing::debug!("保存配置成功"); + } + + if enable_file_logger_changed { + if enable_file_logger { + logger::reload_file_logger() + .map_err(|err| CommandError::from("重新加载文件日志失败", err))?; + } else { + logger::disable_file_logger() + .map_err(|err| CommandError::from("禁用文件日志失败", err))?; + } + } + + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 24f32af..d6479e8 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -22,7 +22,11 @@ fn generate_context() -> tauri::Context { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { let builder = tauri_specta::Builder::::new() - .commands(tauri_specta::collect_commands![greet, get_config]) + .commands(tauri_specta::collect_commands![ + greet, + get_config, + save_config, + ]) .events(tauri_specta::collect_events![LogEvent]); #[cfg(debug_assertions)] diff --git a/src/bindings.ts b/src/bindings.ts index 96ce16a..6d4d1ae 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -10,6 +10,14 @@ async greet(name: string) : Promise { }, async getConfig() : Promise { return await TAURI_INVOKE("get_config"); +}, +async saveConfig(config: Config) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("save_config", { config }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} } } @@ -28,6 +36,7 @@ logEvent: "log-event" /** user-defined types **/ +export type CommandError = { err_title: string; err_message: string } export type Config = { downloadDir: string; enableFileLogger: boolean } export type JsonValue = null | boolean | number | string | JsonValue[] | { [key in string]: JsonValue } export type LogEvent = { timestamp: string; level: LogLevel; fields: { [key in string]: JsonValue }; target: string; filename: string; line_number: number }