package logic import ( "fmt" C "github.com/Dreamacro/clash/constant" "github.com/Dreamacro/clash/rule/common" ) type OR struct { *common.Base rules []C.Rule payload string adapter string needIP bool } func (or *OR) ShouldFindProcess() bool { return false } func (or *OR) RuleType() C.RuleType { return C.OR } func (or *OR) Match(metadata *C.Metadata) bool { for _, rule := range or.rules { if rule.Match(metadata) { return true } } return false } func (or *OR) Adapter() string { return or.adapter } func (or *OR) Payload() string { return or.payload } func (or *OR) ShouldResolveIP() bool { return or.needIP } func NewOR(payload string, adapter string) (*OR, error) { or := &OR{Base: &common.Base{}, payload: payload, adapter: adapter} rules, err := parseRuleByPayload(payload, true) if err != nil { return nil, err } or.rules = rules if len(or.rules) == 0 { return nil, fmt.Errorf("Or rule is error, may be format error or not contain least one rule") } for _, rule := range rules { if rule.ShouldResolveIP() { or.needIP = true break } } return or, nil }