merge.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use super::{use_filter, use_lowercase};
  2. use serde_yaml::{self, Mapping, Sequence, Value};
  3. #[allow(unused)]
  4. const MERGE_FIELDS: [&str; 6] = [
  5. "prepend-rules",
  6. "append-rules",
  7. "prepend-proxies",
  8. "append-proxies",
  9. "prepend-proxy-groups",
  10. "append-proxy-groups",
  11. ];
  12. pub fn use_merge(merge: Mapping, mut config: Mapping) -> Mapping {
  13. // 直接覆盖原字段
  14. use_lowercase(merge.clone())
  15. .into_iter()
  16. .for_each(|(key, value)| {
  17. config.insert(key, value);
  18. });
  19. let merge_list = MERGE_FIELDS.iter().map(|s| s.to_string());
  20. let merge = use_filter(merge, &merge_list.collect());
  21. ["rules", "proxies", "proxy-groups"]
  22. .iter()
  23. .for_each(|key_str| {
  24. let key_val = Value::from(key_str.to_string());
  25. let mut list = Sequence::default();
  26. list = config.get(&key_val).map_or(list.clone(), |val| {
  27. val.as_sequence().map_or(list, |v| v.clone())
  28. });
  29. let pre_key = Value::from(format!("prepend-{key_str}"));
  30. let post_key = Value::from(format!("append-{key_str}"));
  31. if let Some(pre_val) = merge.get(&pre_key) {
  32. if pre_val.is_sequence() {
  33. let mut pre_val = pre_val.as_sequence().unwrap().clone();
  34. pre_val.extend(list);
  35. list = pre_val;
  36. }
  37. }
  38. if let Some(post_val) = merge.get(&post_key) {
  39. if post_val.is_sequence() {
  40. list.extend(post_val.as_sequence().unwrap().clone());
  41. }
  42. }
  43. config.insert(key_val, Value::from(list));
  44. });
  45. config
  46. }
  47. #[test]
  48. fn test_merge() -> anyhow::Result<()> {
  49. let merge = r"
  50. prepend-rules:
  51. - prepend
  52. - 1123123
  53. append-rules:
  54. - append
  55. prepend-proxies:
  56. - 9999
  57. append-proxies:
  58. - 1111
  59. rules:
  60. - replace
  61. proxy-groups:
  62. - 123781923810
  63. tun:
  64. enable: true
  65. dns:
  66. enable: true
  67. ";
  68. let config = r"
  69. rules:
  70. - aaaaa
  71. script1: test
  72. ";
  73. let merge = serde_yaml::from_str::<Mapping>(merge)?;
  74. let config = serde_yaml::from_str::<Mapping>(config)?;
  75. let result = serde_yaml::to_string(&use_merge(merge, config))?;
  76. println!("{result}");
  77. Ok(())
  78. }