mod.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. mod chain;
  2. mod field;
  3. mod merge;
  4. mod script;
  5. mod tun;
  6. use self::chain::*;
  7. use self::field::*;
  8. use self::merge::*;
  9. use self::script::*;
  10. use self::tun::*;
  11. use crate::config::Config;
  12. use serde_yaml::Mapping;
  13. use std::collections::HashMap;
  14. use std::collections::HashSet;
  15. type ResultLog = Vec<(String, String)>;
  16. /// Enhance mode
  17. /// 返回最终订阅、该订阅包含的键、和script执行的结果
  18. pub fn enhance() -> (Mapping, Vec<String>, HashMap<String, ResultLog>) {
  19. // config.yaml 的订阅
  20. let clash_config = { Config::clash().latest().0.clone() };
  21. let (clash_core, enable_tun, enable_builtin, enable_filter) = {
  22. let verge = Config::verge();
  23. let verge = verge.latest();
  24. (
  25. verge.clash_core.clone(),
  26. verge.enable_tun_mode.unwrap_or(false),
  27. verge.enable_builtin_enhanced.unwrap_or(true),
  28. verge.enable_clash_fields.unwrap_or(true),
  29. )
  30. };
  31. // 从profiles里拿东西
  32. let (mut config, chain, valid) = {
  33. let profiles = Config::profiles();
  34. let profiles = profiles.latest();
  35. let current = profiles.current_mapping().unwrap_or_default();
  36. let chain = match profiles.chain.as_ref() {
  37. Some(chain) => chain
  38. .iter()
  39. .filter_map(|uid| profiles.get_item(uid).ok())
  40. .filter_map(<Option<ChainItem>>::from)
  41. .collect::<Vec<ChainItem>>(),
  42. None => vec![],
  43. };
  44. let valid = profiles.valid.clone().unwrap_or_default();
  45. (current, chain, valid)
  46. };
  47. let mut result_map = HashMap::new(); // 保存脚本日志
  48. let mut exists_keys = use_keys(&config); // 保存出现过的keys
  49. let valid = use_valid_fields(valid);
  50. config = use_filter(config, &valid, enable_filter);
  51. // 处理用户的profile
  52. chain.into_iter().for_each(|item| match item.data {
  53. ChainType::Merge(merge) => {
  54. exists_keys.extend(use_keys(&merge));
  55. config = use_merge(merge, config.to_owned());
  56. config = use_filter(config.to_owned(), &valid, enable_filter);
  57. }
  58. ChainType::Script(script) => {
  59. let mut logs = vec![];
  60. match use_script(script, config.to_owned()) {
  61. Ok((res_config, res_logs)) => {
  62. exists_keys.extend(use_keys(&res_config));
  63. config = use_filter(res_config, &valid, enable_filter);
  64. logs.extend(res_logs);
  65. }
  66. Err(err) => logs.push(("exception".into(), err.to_string())),
  67. }
  68. result_map.insert(item.uid, logs);
  69. }
  70. });
  71. // 合并默认的config
  72. for (key, value) in clash_config.into_iter() {
  73. config.insert(key, value);
  74. }
  75. let clash_fields = use_clash_fields();
  76. // 内建脚本最后跑
  77. if enable_builtin {
  78. ChainItem::builtin()
  79. .into_iter()
  80. .filter(|(s, _)| s.is_support(clash_core.as_ref()))
  81. .map(|(_, c)| c)
  82. .for_each(|item| {
  83. log::debug!(target: "app", "run builtin script {}", item.uid);
  84. match item.data {
  85. ChainType::Script(script) => match use_script(script, config.to_owned()) {
  86. Ok((res_config, _)) => {
  87. config = use_filter(res_config, &clash_fields, enable_filter);
  88. }
  89. Err(err) => {
  90. log::error!(target: "app", "builtin script error `{err}`");
  91. }
  92. },
  93. _ => {}
  94. }
  95. });
  96. }
  97. config = use_filter(config, &clash_fields, enable_filter);
  98. config = use_tun(config, enable_tun);
  99. config = use_sort(config, enable_filter);
  100. let mut exists_set = HashSet::new();
  101. exists_set.extend(exists_keys.into_iter().filter(|s| clash_fields.contains(s)));
  102. exists_keys = exists_set.into_iter().collect();
  103. (config, exists_keys, result_map)
  104. }