mod.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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) = {
  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. )
  29. };
  30. // 从profiles里拿东西
  31. let (mut config, chain) = {
  32. let profiles = Config::profiles();
  33. let profiles = profiles.latest();
  34. let current = profiles.current_mapping().unwrap_or_default();
  35. let chain = match profiles.chain.as_ref() {
  36. Some(chain) => chain
  37. .iter()
  38. .filter_map(|uid| profiles.get_item(uid).ok())
  39. .filter_map(<Option<ChainItem>>::from)
  40. .collect::<Vec<ChainItem>>(),
  41. None => vec![],
  42. };
  43. (current, chain)
  44. };
  45. let mut result_map = HashMap::new(); // 保存脚本日志
  46. let mut exists_keys = use_keys(&config); // 保存出现过的keys
  47. // 处理用户的profile
  48. chain.into_iter().for_each(|item| match item.data {
  49. ChainType::Merge(merge) => {
  50. exists_keys.extend(use_keys(&merge));
  51. config = use_merge(merge, config.to_owned());
  52. }
  53. ChainType::Script(script) => {
  54. let mut logs = vec![];
  55. match use_script(script, config.to_owned()) {
  56. Ok((res_config, res_logs)) => {
  57. exists_keys.extend(use_keys(&res_config));
  58. config = res_config;
  59. logs.extend(res_logs);
  60. }
  61. Err(err) => logs.push(("exception".into(), err.to_string())),
  62. }
  63. result_map.insert(item.uid, logs);
  64. }
  65. });
  66. // 合并默认的config
  67. for (key, value) in clash_config.into_iter() {
  68. config.insert(key, value);
  69. }
  70. // 内建脚本最后跑
  71. if enable_builtin {
  72. ChainItem::builtin()
  73. .into_iter()
  74. .filter(|(s, _)| s.is_support(clash_core.as_ref()))
  75. .map(|(_, c)| c)
  76. .for_each(|item| {
  77. log::debug!(target: "app", "run builtin script {}", item.uid);
  78. match item.data {
  79. ChainType::Script(script) => match use_script(script, config.to_owned()) {
  80. Ok((res_config, _)) => {
  81. config = res_config;
  82. }
  83. Err(err) => {
  84. log::error!(target: "app", "builtin script error `{err}`");
  85. }
  86. },
  87. _ => {}
  88. }
  89. });
  90. }
  91. config = use_tun(config, enable_tun);
  92. config = use_sort(config);
  93. let mut exists_set = HashSet::new();
  94. exists_set.extend(exists_keys.into_iter());
  95. exists_keys = exists_set.into_iter().collect();
  96. (config, exists_keys, result_map)
  97. }