93 lines
2.3 KiB
Rust
Raw Normal View History

2022-08-12 03:20:55 +08:00
use super::{use_filter, use_lowercase};
2022-08-11 02:55:10 +08:00
use serde_yaml::{self, Mapping, Sequence, Value};
const MERGE_FIELDS: [&str; 6] = [
2022-11-12 11:37:23 +08:00
"prepend-rules",
"append-rules",
"prepend-proxies",
"append-proxies",
"prepend-proxy-groups",
"append-proxy-groups",
2022-08-11 02:55:10 +08:00
];
2022-08-12 03:20:55 +08:00
pub fn use_merge(merge: Mapping, mut config: Mapping) -> Mapping {
2022-11-12 11:37:23 +08:00
// 直接覆盖原字段
use_lowercase(merge.clone())
.into_iter()
.for_each(|(key, value)| {
config.insert(key, value);
});
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
let merge_list = MERGE_FIELDS.iter().map(|s| s.to_string());
let merge = use_filter(merge, &merge_list.collect(), true);
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
["rules", "proxies", "proxy-groups"]
.iter()
.for_each(|key_str| {
let key_val = Value::from(key_str.to_string());
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
let mut list = Sequence::default();
list = config.get(&key_val).map_or(list.clone(), |val| {
val.as_sequence().map_or(list, |v| v.clone())
});
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
let pre_key = Value::from(format!("prepend-{key_str}"));
let post_key = Value::from(format!("append-{key_str}"));
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
if let Some(pre_val) = merge.get(&pre_key) {
if pre_val.is_sequence() {
let mut pre_val = pre_val.as_sequence().unwrap().clone();
pre_val.extend(list);
list = pre_val;
}
}
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
if let Some(post_val) = merge.get(&post_key) {
if post_val.is_sequence() {
list.extend(post_val.as_sequence().unwrap().clone());
}
}
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
config.insert(key_val, Value::from(list));
});
config
2022-08-11 02:55:10 +08:00
}
#[test]
fn test_merge() -> anyhow::Result<()> {
2022-11-12 11:37:23 +08:00
let merge = r"
2022-08-11 02:55:10 +08:00
prepend-rules:
- prepend
- 1123123
append-rules:
- append
prepend-proxies:
- 9999
append-proxies:
- 1111
rules:
- replace
proxy-groups:
- 123781923810
tun:
enable: true
dns:
enable: true
";
2022-11-12 11:37:23 +08:00
let config = r"
2022-08-11 02:55:10 +08:00
rules:
- aaaaa
script1: test
";
2022-11-12 11:37:23 +08:00
let merge = serde_yaml::from_str::<Mapping>(merge)?;
let config = serde_yaml::from_str::<Mapping>(config)?;
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
let result = serde_yaml::to_string(&use_merge(merge, config))?;
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
println!("{result}");
2022-08-11 02:55:10 +08:00
2022-11-12 11:37:23 +08:00
Ok(())
2022-08-11 02:55:10 +08:00
}