From 6897ead070379ade59f1a7b98f90d68bbdbde899 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Sun, 30 Nov 2025 20:44:21 +0800 Subject: [PATCH] perf: change patch_config parameter from Mapping to &Mapping for efficiency --- crates/clash-verge-types/src/runtime.rs | 2 +- src-tauri/src/cmd/clash.rs | 4 ++-- src-tauri/src/config/clash.rs | 25 +++++++++++++------------ src-tauri/src/feat/clash.rs | 2 +- src-tauri/src/feat/config.rs | 6 ++---- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/crates/clash-verge-types/src/runtime.rs b/crates/clash-verge-types/src/runtime.rs index 915b07871..fd0bdf51a 100644 --- a/crates/clash-verge-types/src/runtime.rs +++ b/crates/clash-verge-types/src/runtime.rs @@ -22,7 +22,7 @@ impl IRuntime { // 这里只更改 allow-lan | ipv6 | log-level | tun #[inline] - pub fn patch_config(&mut self, patch: Mapping) { + pub fn patch_config(&mut self, patch: &Mapping) { let config = if let Some(config) = self.config.as_mut() { config } else { diff --git a/src-tauri/src/cmd/clash.rs b/src-tauri/src/cmd/clash.rs index 48297281c..d4bfb9ed8 100644 --- a/src-tauri/src/cmd/clash.rs +++ b/src-tauri/src/cmd/clash.rs @@ -29,7 +29,7 @@ pub async fn get_clash_info() -> CmdResult { /// 修改Clash配置 #[tauri::command] pub async fn patch_clash_config(payload: Mapping) -> CmdResult { - feat::patch_clash(payload).await.stringify_err() + feat::patch_clash(&payload).await.stringify_err() } /// 修改Clash模式 @@ -171,7 +171,7 @@ pub async fn apply_dns_config(apply: bool) -> CmdResult { // 应用DNS配置到运行时配置 Config::runtime().await.edit_draft(|d| { - d.patch_config(patch); + d.patch_config(&patch); }); // 重新生成配置 diff --git a/src-tauri/src/config/clash.rs b/src-tauri/src/config/clash.rs index c3dbc9e53..f036c9ce6 100644 --- a/src-tauri/src/config/clash.rs +++ b/src-tauri/src/config/clash.rs @@ -16,7 +16,6 @@ pub struct IClashTemp(pub Mapping); impl IClashTemp { pub async fn new() -> Self { - let template = Self::template(); let clash_path_result = dirs::clash_path(); let map_result = if let Ok(path) = clash_path_result { help::read_mapping(&path).await @@ -26,24 +25,26 @@ impl IClashTemp { match map_result { Ok(mut map) => { - template.0.keys().for_each(|key| { - if !map.contains_key(key) - && let Some(value) = template.0.get(key) - { - map.insert(key.clone(), value.clone()); + let template_map = Self::template().0; + for (key, value) in template_map.into_iter() { + if !map.contains_key(&key) { + map.insert(key, value); } - }); + } + // 确保 secret 字段存在且不为空 - if let Some(Value::String(s)) = map.get_mut("secret") + if let Some(val) = map.get_mut("secret") + && let Value::String(s) = val && s.is_empty() { *s = "set-your-secret".into(); } + Self(Self::guard(map)) } Err(err) => { logging!(error, Type::Config, "{err}"); - template + Self::template() } } } @@ -144,9 +145,9 @@ impl IClashTemp { config } - pub fn patch_config(&mut self, patch: Mapping) { - for (key, value) in patch.into_iter() { - self.0.insert(key, value); + pub fn patch_config(&mut self, patch: &Mapping) { + for (key, value) in patch.iter() { + self.0.insert(key.to_owned(), value.to_owned()); } } diff --git a/src-tauri/src/feat/clash.rs b/src-tauri/src/feat/clash.rs index bfe88d2f1..5142791ac 100644 --- a/src-tauri/src/feat/clash.rs +++ b/src-tauri/src/feat/clash.rs @@ -84,7 +84,7 @@ pub async fn change_clash_mode(mode: String) { // 更新订阅 Config::clash() .await - .edit_draft(|d| d.patch_config(mapping)); + .edit_draft(|d| d.patch_config(&mapping)); // 分离数据获取和异步调用 let clash_data = Config::clash().await.data_arc(); diff --git a/src-tauri/src/feat/config.rs b/src-tauri/src/feat/config.rs index 1160a5511..07ca1a2e9 100644 --- a/src-tauri/src/feat/config.rs +++ b/src-tauri/src/feat/config.rs @@ -9,10 +9,8 @@ use clash_verge_logging::{Type, logging, logging_error}; use serde_yaml_ng::Mapping; /// Patch Clash configuration -pub async fn patch_clash(patch: Mapping) -> Result<()> { - Config::clash() - .await - .edit_draft(|d| d.patch_config(patch.clone())); +pub async fn patch_clash(patch: &Mapping) -> Result<()> { + Config::clash().await.edit_draft(|d| d.patch_config(patch)); let res = { // 激活订阅