rule.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package geosite
  2. import "github.com/sagernet/sing-box/option"
  3. type ItemType = uint8
  4. const (
  5. RuleTypeDomain ItemType = iota
  6. RuleTypeDomainSuffix
  7. RuleTypeDomainKeyword
  8. RuleTypeDomainRegex
  9. )
  10. type Item struct {
  11. Type ItemType
  12. Value string
  13. }
  14. func Compile(code []Item) option.DefaultRule {
  15. var domainLength int
  16. var domainSuffixLength int
  17. var domainKeywordLength int
  18. var domainRegexLength int
  19. for _, item := range code {
  20. switch item.Type {
  21. case RuleTypeDomain:
  22. domainLength++
  23. case RuleTypeDomainSuffix:
  24. domainSuffixLength++
  25. case RuleTypeDomainKeyword:
  26. domainKeywordLength++
  27. case RuleTypeDomainRegex:
  28. domainRegexLength++
  29. }
  30. }
  31. var codeRule option.DefaultRule
  32. if domainLength > 0 {
  33. codeRule.Domain = make([]string, 0, domainLength)
  34. }
  35. if domainSuffixLength > 0 {
  36. codeRule.DomainSuffix = make([]string, 0, domainSuffixLength)
  37. }
  38. if domainKeywordLength > 0 {
  39. codeRule.DomainKeyword = make([]string, 0, domainKeywordLength)
  40. }
  41. if domainRegexLength > 0 {
  42. codeRule.DomainRegex = make([]string, 0, domainRegexLength)
  43. }
  44. for _, item := range code {
  45. switch item.Type {
  46. case RuleTypeDomain:
  47. codeRule.Domain = append(codeRule.Domain, item.Value)
  48. case RuleTypeDomainSuffix:
  49. codeRule.DomainSuffix = append(codeRule.DomainSuffix, item.Value)
  50. case RuleTypeDomainKeyword:
  51. codeRule.DomainKeyword = append(codeRule.DomainKeyword, item.Value)
  52. case RuleTypeDomainRegex:
  53. codeRule.DomainRegex = append(codeRule.DomainRegex, item.Value)
  54. }
  55. }
  56. return codeRule
  57. }
  58. func Merge(rules []option.DefaultRule) option.DefaultRule {
  59. var domainLength int
  60. var domainSuffixLength int
  61. var domainKeywordLength int
  62. var domainRegexLength int
  63. for _, subRule := range rules {
  64. domainLength += len(subRule.Domain)
  65. domainSuffixLength += len(subRule.DomainSuffix)
  66. domainKeywordLength += len(subRule.DomainKeyword)
  67. domainRegexLength += len(subRule.DomainRegex)
  68. }
  69. var rule option.DefaultRule
  70. if domainLength > 0 {
  71. rule.Domain = make([]string, 0, domainLength)
  72. }
  73. if domainSuffixLength > 0 {
  74. rule.DomainSuffix = make([]string, 0, domainSuffixLength)
  75. }
  76. if domainKeywordLength > 0 {
  77. rule.DomainKeyword = make([]string, 0, domainKeywordLength)
  78. }
  79. if domainRegexLength > 0 {
  80. rule.DomainRegex = make([]string, 0, domainRegexLength)
  81. }
  82. for _, subRule := range rules {
  83. if len(subRule.Domain) > 0 {
  84. rule.Domain = append(rule.Domain, subRule.Domain...)
  85. }
  86. if len(subRule.DomainSuffix) > 0 {
  87. rule.DomainSuffix = append(rule.DomainSuffix, subRule.DomainSuffix...)
  88. }
  89. if len(subRule.DomainKeyword) > 0 {
  90. rule.DomainKeyword = append(rule.DomainKeyword, subRule.DomainKeyword...)
  91. }
  92. if len(subRule.DomainRegex) > 0 {
  93. rule.DomainRegex = append(rule.DomainRegex, subRule.DomainRegex...)
  94. }
  95. }
  96. return rule
  97. }