From f0d88d4e73ff4d1d017fa22e4abdc9a31efdfccf Mon Sep 17 00:00:00 2001 From: Pylogmon Date: Fri, 8 Mar 2024 11:37:52 +0800 Subject: [PATCH] feat: Merge Providers (#508) --- src-tauri/src/enhance/merge.rs | 43 ++++++++++++++++++++++++++++++++-- src-tauri/src/utils/tmpl.rs | 8 +++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/enhance/merge.rs b/src-tauri/src/enhance/merge.rs index 795eca8d..3f5405bc 100644 --- a/src-tauri/src/enhance/merge.rs +++ b/src-tauri/src/enhance/merge.rs @@ -1,11 +1,15 @@ use super::{use_filter, use_lowercase}; use serde_yaml::{self, Mapping, Sequence, Value}; -const MERGE_FIELDS: [&str; 6] = [ +const MERGE_FIELDS: [&str; 10] = [ "prepend-rules", "append-rules", + "prepend-rule-providers", + "append-rule-providers", "prepend-proxies", "append-proxies", + "prepend-proxy-providers", + "append-proxy-providers", "prepend-proxy-groups", "append-proxy-groups", ]; @@ -22,6 +26,39 @@ pub fn use_merge(merge: Mapping, mut config: Mapping) -> Mapping { let merge_list = MERGE_FIELDS.iter().map(|s| s.to_string()); let merge = use_filter(merge, &merge_list.collect()); + ["rule-providers", "proxy-providers"] + .iter() + .for_each(|key_str| { + let key_val = Value::from(key_str.to_string()); + + let mut map = Mapping::default(); + + map = config.get(&key_val).map_or(map.clone(), |val| { + val.as_mapping().map_or(map, |v| v.clone()) + }); + + let pre_key = Value::from(format!("prepend-{key_str}")); + let post_key = Value::from(format!("append-{key_str}")); + + if let Some(pre_val) = merge.get(&pre_key) { + if pre_val.is_mapping() { + let mut pre_val = pre_val.as_mapping().unwrap().clone(); + pre_val.extend(map); + map = pre_val; + } + } + + if let Some(post_val) = merge.get(&post_key) { + if post_val.is_mapping() { + map.extend(post_val.as_mapping().unwrap().clone()); + } + } + + if !map.is_empty() { + config.insert(key_val, Value::from(map)); + } + }); + ["rules", "proxies", "proxy-groups"] .iter() .for_each(|key_str| { @@ -49,7 +86,9 @@ pub fn use_merge(merge: Mapping, mut config: Mapping) -> Mapping { } } - config.insert(key_val, Value::from(list)); + if !list.is_empty() { + config.insert(key_val, Value::from(list)); + } }); config } diff --git a/src-tauri/src/utils/tmpl.rs b/src-tauri/src/utils/tmpl.rs index cdb04f00..10e8b4bd 100644 --- a/src-tauri/src/utils/tmpl.rs +++ b/src-tauri/src/utils/tmpl.rs @@ -16,14 +16,22 @@ pub const ITEM_MERGE: &str = "# Merge Template for clash verge prepend-rules: +prepend-rule-providers: + prepend-proxies: +prepend-proxy-providers: + prepend-proxy-groups: append-rules: +append-rule-providers: + append-proxies: +append-proxy-providers: + append-proxy-groups: ";