From 64ac6001e4c93e9d4a14b88206dcd716fd616cb8 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 28 Oct 2026 00:08:06 +0800 Subject: [PATCH] refactor(enhance): lowercase takes a reference and chain support is copy use_lowercase borrows the mapping and clones only the values; call sites no longer clone whole configs. ChainSupport is a fieldless enum and now Copy; builtin() registers each support pair without clones. --- src-tauri/src/enhance/chain.rs | 13 +++++-------- src-tauri/src/enhance/field.rs | 6 +++--- src-tauri/src/enhance/merge.rs | 2 +- src-tauri/src/enhance/mod.rs | 2 +- src-tauri/src/enhance/script.rs | 6 +++--- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src-tauri/src/enhance/chain.rs b/src-tauri/src/enhance/chain.rs index 6c627075d..38c2b780b 100644 --- a/src-tauri/src/enhance/chain.rs +++ b/src-tauri/src/enhance/chain.rs @@ -22,7 +22,7 @@ pub enum ChainType { Groups(SeqMap), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub enum ChainSupport { Mihomo, MihomoAlpha, @@ -70,14 +70,11 @@ impl ChainItem { /// 内建支持一些脚本 pub fn builtin() -> Vec<(ChainSupport, Self)> { // data intentionally empty: the enhance loop dispatches on uid to native implementations - let hy_alpn = Self::to_script("verge_hy_alpn", ""); - let meta_guard = Self::to_script("verge_meta_guard", ""); - vec![ - (ChainSupport::Mihomo, hy_alpn.clone()), - (ChainSupport::Mihomo, meta_guard.clone()), - (ChainSupport::MihomoAlpha, hy_alpn), - (ChainSupport::MihomoAlpha, meta_guard), + (ChainSupport::Mihomo, Self::to_script("verge_hy_alpn", "")), + (ChainSupport::Mihomo, Self::to_script("verge_meta_guard", "")), + (ChainSupport::MihomoAlpha, Self::to_script("verge_hy_alpn", "")), + (ChainSupport::MihomoAlpha, Self::to_script("verge_meta_guard", "")), ] } diff --git a/src-tauri/src/enhance/field.rs b/src-tauri/src/enhance/field.rs index 1b1567fed..038980f55 100644 --- a/src-tauri/src/enhance/field.rs +++ b/src-tauri/src/enhance/field.rs @@ -24,12 +24,12 @@ fn lowercase_key(key: &str) -> Value { Value::from(key.as_str()) } -pub fn use_lowercase(config: Mapping) -> Mapping { +pub fn use_lowercase(config: &Mapping) -> Mapping { let mut lowercased = Mapping::new(); - for (key, value) in config { + for (key, value) in config.iter() { if let Some(key_str) = key.as_str() { - lowercased.insert(lowercase_key(key_str), value); + lowercased.insert(lowercase_key(key_str), value.clone()); } } lowercased diff --git a/src-tauri/src/enhance/merge.rs b/src-tauri/src/enhance/merge.rs index f2ba0c56a..c1c00fc05 100644 --- a/src-tauri/src/enhance/merge.rs +++ b/src-tauri/src/enhance/merge.rs @@ -17,7 +17,7 @@ fn deep_merge(a: &mut Value, b: Value) { } pub fn use_merge(merge: &Mapping, mut config: Mapping) -> Mapping { - for (key, value) in use_lowercase(merge.clone()) { + for (key, value) in use_lowercase(merge) { match (config.get_mut(&key), value) { (Some(Value::Mapping(existing)), Value::Mapping(overlay)) if key.as_str() == Some("dns") => { existing.extend(overlay); diff --git a/src-tauri/src/enhance/mod.rs b/src-tauri/src/enhance/mod.rs index e4d44d6a2..09f9e3635 100644 --- a/src-tauri/src/enhance/mod.rs +++ b/src-tauri/src/enhance/mod.rs @@ -614,7 +614,7 @@ fn apply_builtin_scripts(mut config: Mapping, clash_core: Option, enable .collect(); if !items.is_empty() { // The JS path saw a lowercased view; lowercase once, only when a builtin runs. - config = use_lowercase(config); + config = use_lowercase(&config); for item in items { logging!(debug, Type::Core, "run builtin script {}", item.uid); config = match item.uid.as_str() { diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs index 33ea4f804..b69ee7494 100644 --- a/src-tauri/src/enhance/script.rs +++ b/src-tauri/src/enhance/script.rs @@ -22,10 +22,10 @@ type EvalOutcome = (Result, Vec<(String, String)>) pub(super) async fn use_script(script: String, config: Mapping, name: String) -> ScriptResult { // The template is identity-plus-lowercasing; skip the Boa round-trip. if script == tmpl::ITEM_SCRIPT { - return (use_lowercase(config), vec![], vec![]); + return (use_lowercase(&config), vec![], vec![]); } - let json = match serde_json::to_string(&use_lowercase(config.clone())) { + let json = match serde_json::to_string(&use_lowercase(&config)) { Ok(json) if json.len() <= MAX_JSON_SIZE => json, Ok(_) => { let message = "Configuration size exceeds maximum allowed size"; @@ -173,7 +173,7 @@ fn eval_script(script: &str, config_json: &str, name: &String) -> EvalOutcome { } match parse_json_safely(&result) { - Ok(config) => (Ok(use_lowercase(config)), outputs.lock().to_vec()), + Ok(config) => (Ok(use_lowercase(&config)), outputs.lock().to_vec()), Err(err) => { logging!( error,