parser.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package rules
  2. import (
  3. "fmt"
  4. C "github.com/metacubex/mihomo/constant"
  5. RC "github.com/metacubex/mihomo/rules/common"
  6. "github.com/metacubex/mihomo/rules/logic"
  7. RP "github.com/metacubex/mihomo/rules/provider"
  8. )
  9. func ParseRule(tp, payload, target string, params []string, subRules map[string][]C.Rule) (parsed C.Rule, parseErr error) {
  10. switch tp {
  11. case "DOMAIN":
  12. parsed = RC.NewDomain(payload, target)
  13. case "DOMAIN-SUFFIX":
  14. parsed = RC.NewDomainSuffix(payload, target)
  15. case "DOMAIN-KEYWORD":
  16. parsed = RC.NewDomainKeyword(payload, target)
  17. case "DOMAIN-REGEX":
  18. parsed, parseErr = RC.NewDomainRegex(payload, target)
  19. case "GEOSITE":
  20. parsed, parseErr = RC.NewGEOSITE(payload, target)
  21. case "GEOIP":
  22. noResolve := RC.HasNoResolve(params)
  23. parsed, parseErr = RC.NewGEOIP(payload, target, false, noResolve)
  24. case "SRC-GEOIP":
  25. parsed, parseErr = RC.NewGEOIP(payload, target, true, true)
  26. case "IP-ASN":
  27. noResolve := RC.HasNoResolve(params)
  28. parsed, parseErr = RC.NewIPASN(payload, target, false, noResolve)
  29. case "SRC-IP-ASN":
  30. parsed, parseErr = RC.NewIPASN(payload, target, true, true)
  31. case "IP-CIDR", "IP-CIDR6":
  32. noResolve := RC.HasNoResolve(params)
  33. parsed, parseErr = RC.NewIPCIDR(payload, target, RC.WithIPCIDRNoResolve(noResolve))
  34. case "SRC-IP-CIDR":
  35. parsed, parseErr = RC.NewIPCIDR(payload, target, RC.WithIPCIDRSourceIP(true), RC.WithIPCIDRNoResolve(true))
  36. case "IP-SUFFIX":
  37. noResolve := RC.HasNoResolve(params)
  38. parsed, parseErr = RC.NewIPSuffix(payload, target, false, noResolve)
  39. case "SRC-IP-SUFFIX":
  40. parsed, parseErr = RC.NewIPSuffix(payload, target, true, true)
  41. case "SRC-PORT":
  42. parsed, parseErr = RC.NewPort(payload, target, C.SrcPort)
  43. case "DST-PORT":
  44. parsed, parseErr = RC.NewPort(payload, target, C.DstPort)
  45. case "IN-PORT":
  46. parsed, parseErr = RC.NewPort(payload, target, C.InPort)
  47. case "DSCP":
  48. parsed, parseErr = RC.NewDSCP(payload, target)
  49. case "PROCESS-NAME":
  50. parsed, parseErr = RC.NewProcess(payload, target, true, false)
  51. case "PROCESS-PATH":
  52. parsed, parseErr = RC.NewProcess(payload, target, false, false)
  53. case "PROCESS-NAME-REGEX":
  54. parsed, parseErr = RC.NewProcess(payload, target, true, true)
  55. case "PROCESS-PATH-REGEX":
  56. parsed, parseErr = RC.NewProcess(payload, target, false, true)
  57. case "NETWORK":
  58. parsed, parseErr = RC.NewNetworkType(payload, target)
  59. case "UID":
  60. parsed, parseErr = RC.NewUid(payload, target)
  61. case "IN-TYPE":
  62. parsed, parseErr = RC.NewInType(payload, target)
  63. case "IN-USER":
  64. parsed, parseErr = RC.NewInUser(payload, target)
  65. case "IN-NAME":
  66. parsed, parseErr = RC.NewInName(payload, target)
  67. case "SUB-RULE":
  68. parsed, parseErr = logic.NewSubRule(payload, target, subRules, ParseRule)
  69. case "AND":
  70. parsed, parseErr = logic.NewAND(payload, target, ParseRule)
  71. case "OR":
  72. parsed, parseErr = logic.NewOR(payload, target, ParseRule)
  73. case "NOT":
  74. parsed, parseErr = logic.NewNOT(payload, target, ParseRule)
  75. case "RULE-SET":
  76. noResolve := RC.HasNoResolve(params)
  77. parsed, parseErr = RP.NewRuleSet(payload, target, noResolve)
  78. case "MATCH":
  79. parsed = RC.NewMatch(target)
  80. parseErr = nil
  81. default:
  82. parseErr = fmt.Errorf("unsupported rule type %s", tp)
  83. }
  84. if parseErr != nil {
  85. return nil, parseErr
  86. }
  87. return
  88. }