diff --git a/rule/provider/parse.go b/rule/provider/parse.go index 8d07f4693..230bc8883 100644 --- a/rule/provider/parse.go +++ b/rule/provider/parse.go @@ -85,6 +85,9 @@ func parseRule(tp, payload, target string, params []string) (C.Rule, error) { default: parseErr = fmt.Errorf("unsupported rule type %s", tp) } + if parseErr != nil { + return nil, parseErr + } ruleExtra := &C.RuleExtra{ Network: RC.FindNetwork(params), SourceIPs: RC.FindSourceIPs(params), diff --git a/rule/provider/provider.go b/rule/provider/provider.go index 2befc694f..a587ecaf1 100644 --- a/rule/provider/provider.go +++ b/rule/provider/provider.go @@ -6,10 +6,12 @@ import ( "github.com/Dreamacro/clash/component/trie" C "github.com/Dreamacro/clash/constant" P "github.com/Dreamacro/clash/constant/provider" + "github.com/Dreamacro/clash/log" "gopkg.in/yaml.v2" "runtime" "strings" "time" + "unsafe" ) var ( @@ -129,7 +131,12 @@ func NewRuleSetProvider(name string, behavior P.RuleType, interval time.Duration return err } - rp.count = len(rulesRaw) + if rp.behavior == P.Classical { + rp.count = len(*(*[]C.Rule)(unsafe.Pointer(&rules))) + } else { + rp.count = len(rulesRaw) + } + rp.setRules(rules) return nil } @@ -201,13 +208,12 @@ func handleClassicalRules(rules []string) (interface{}, error) { var classicalRules []C.Rule for _, rawRule := range rules { ruleType, rule, params := ruleParse(rawRule) - if ruleType == "RULE-SET" { - return nil, errors.New("error rule type") - } r, err := parseRule(ruleType, rule, "", params) if err != nil { - return nil, err + //return nil, err + log.Warnln("%s", err) + continue } classicalRules = append(classicalRules, r)