Преглед на файлове

feat: Merge Providers (#508)

Pylogmon преди 1 година
родител
ревизия
f0719f8bde
променени са 2 файла, в които са добавени 49 реда и са изтрити 2 реда
  1. 41 2
      src-tauri/src/enhance/merge.rs
  2. 8 0
      src-tauri/src/utils/tmpl.rs

+ 41 - 2
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
 }

+ 8 - 0
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:
 ";