| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package route
- import (
- "strings"
- "github.com/sagernet/sing-box/adapter"
- "github.com/sagernet/sing/common"
- E "github.com/sagernet/sing/common/exceptions"
- F "github.com/sagernet/sing/common/format"
- )
- var _ RuleItem = (*RuleSetItem)(nil)
- type RuleSetItem struct {
- router adapter.Router
- tagList []string
- setList []adapter.RuleSet
- ipcidrMatchSource bool
- }
- func NewRuleSetItem(router adapter.Router, tagList []string, ipCIDRMatchSource bool) *RuleSetItem {
- return &RuleSetItem{
- router: router,
- tagList: tagList,
- ipcidrMatchSource: ipCIDRMatchSource,
- }
- }
- func (r *RuleSetItem) Start() error {
- for _, tag := range r.tagList {
- ruleSet, loaded := r.router.RuleSet(tag)
- if !loaded {
- return E.New("rule-set not found: ", tag)
- }
- r.setList = append(r.setList, ruleSet)
- }
- return nil
- }
- func (r *RuleSetItem) Match(metadata *adapter.InboundContext) bool {
- metadata.IPCIDRMatchSource = r.ipcidrMatchSource
- for _, ruleSet := range r.setList {
- if ruleSet.Match(metadata) {
- return true
- }
- }
- return false
- }
- func (r *RuleSetItem) ContainsIPCIDRRule() bool {
- return common.Any(r.setList, func(ruleSet adapter.RuleSet) bool {
- return ruleSet.Metadata().ContainsIPCIDRRule
- })
- }
- func (r *RuleSetItem) String() string {
- if len(r.tagList) == 1 {
- return F.ToString("rule_set=", r.tagList[0])
- } else {
- return F.ToString("rule_set=[", strings.Join(r.tagList, " "), "]")
- }
- }
|