field.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. use serde_yaml::{Mapping, Value};
  2. pub const HANDLE_FIELDS: [&str; 9] = [
  3. "port",
  4. "socks-port",
  5. "mixed-port",
  6. "mode",
  7. "ipv6",
  8. "log-level",
  9. "allow-lan",
  10. "external-controller",
  11. "secret",
  12. ];
  13. pub const DEFAULT_FIELDS: [&str; 5] = [
  14. "proxies",
  15. "proxy-groups",
  16. "rules",
  17. "proxy-providers",
  18. "rule-providers",
  19. ];
  20. pub const OTHERS_FIELDS: [&str; 21] = [
  21. "tun",
  22. "dns",
  23. "ebpf",
  24. "hosts",
  25. "script",
  26. "profile",
  27. "payload",
  28. "auto-redir",
  29. "experimental",
  30. "interface-name",
  31. "routing-mark",
  32. "redir-port",
  33. "tproxy-port",
  34. "iptables",
  35. "external-ui",
  36. "bind-address",
  37. "authentication",
  38. "sniffer", // meta
  39. "sub-rules", // meta
  40. "geodata-mode", // meta
  41. "tcp-concurrent", // meta
  42. ];
  43. pub fn use_clash_fields() -> Vec<String> {
  44. DEFAULT_FIELDS
  45. .into_iter()
  46. .chain(HANDLE_FIELDS)
  47. .chain(OTHERS_FIELDS)
  48. .map(|s| s.to_string())
  49. .collect()
  50. }
  51. pub fn use_valid_fields(mut valid: Vec<String>) -> Vec<String> {
  52. let others = Vec::from(OTHERS_FIELDS);
  53. valid.iter_mut().for_each(|s| s.make_ascii_lowercase());
  54. valid
  55. .into_iter()
  56. .filter(|s| others.contains(&s.as_str()))
  57. .chain(DEFAULT_FIELDS.iter().map(|s| s.to_string()))
  58. .collect()
  59. }
  60. pub fn use_filter(config: Mapping, filter: &Vec<String>) -> Mapping {
  61. let mut ret = Mapping::new();
  62. for (key, value) in config.into_iter() {
  63. if let Some(key) = key.as_str() {
  64. if filter.contains(&key.to_string()) {
  65. ret.insert(Value::from(key), value);
  66. }
  67. }
  68. }
  69. ret
  70. }
  71. pub fn use_lowercase(config: Mapping) -> Mapping {
  72. let mut ret = Mapping::new();
  73. for (key, value) in config.into_iter() {
  74. if let Some(key_str) = key.as_str() {
  75. let mut key_str = String::from(key_str);
  76. key_str.make_ascii_lowercase();
  77. ret.insert(Value::from(key_str), value);
  78. }
  79. }
  80. ret
  81. }
  82. pub fn use_sort(config: Mapping) -> Mapping {
  83. let mut ret = Mapping::new();
  84. HANDLE_FIELDS
  85. .into_iter()
  86. .chain(OTHERS_FIELDS)
  87. .chain(DEFAULT_FIELDS)
  88. .for_each(|key| {
  89. let key = Value::from(key);
  90. config.get(&key).map(|value| {
  91. ret.insert(key, value.clone());
  92. });
  93. });
  94. ret
  95. }
  96. pub fn use_keys(config: &Mapping) -> Vec<String> {
  97. config
  98. .iter()
  99. .filter_map(|(key, _)| key.as_str())
  100. .map(|s| {
  101. let mut s = s.to_string();
  102. s.make_ascii_lowercase();
  103. return s;
  104. })
  105. .collect()
  106. }