feat: Merge Providers (#508)

This commit is contained in:
Pylogmon 2024-03-08 11:37:52 +08:00 committed by GitHub
parent 772cbd6ffd
commit f0d88d4e73
2 changed files with 49 additions and 2 deletions

View File

@ -1,11 +1,15 @@
use super::{use_filter, use_lowercase}; use super::{use_filter, use_lowercase};
use serde_yaml::{self, Mapping, Sequence, Value}; use serde_yaml::{self, Mapping, Sequence, Value};
const MERGE_FIELDS: [&str; 6] = [ const MERGE_FIELDS: [&str; 10] = [
"prepend-rules", "prepend-rules",
"append-rules", "append-rules",
"prepend-rule-providers",
"append-rule-providers",
"prepend-proxies", "prepend-proxies",
"append-proxies", "append-proxies",
"prepend-proxy-providers",
"append-proxy-providers",
"prepend-proxy-groups", "prepend-proxy-groups",
"append-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_list = MERGE_FIELDS.iter().map(|s| s.to_string());
let merge = use_filter(merge, &merge_list.collect()); 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"] ["rules", "proxies", "proxy-groups"]
.iter() .iter()
.for_each(|key_str| { .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 config
} }

View File

@ -16,14 +16,22 @@ pub const ITEM_MERGE: &str = "# Merge Template for clash verge
prepend-rules: prepend-rules:
prepend-rule-providers:
prepend-proxies: prepend-proxies:
prepend-proxy-providers:
prepend-proxy-groups: prepend-proxy-groups:
append-rules: append-rules:
append-rule-providers:
append-proxies: append-proxies:
append-proxy-providers:
append-proxy-groups: append-proxy-groups:
"; ";