| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package json
- import (
- "encoding/json"
- v2routerjson "github.com/v2ray/v2ray-core/app/router/json"
- "github.com/v2ray/v2ray-core/app/router/rules"
- "github.com/v2ray/v2ray-core/common/log"
- )
- type RouterRuleConfig struct {
- RuleList []json.RawMessage `json:"rules"`
- }
- func parseRule(msg json.RawMessage) rules.Rule {
- rule := new(Rule)
- err := json.Unmarshal(msg, rule)
- if err != nil {
- log.Error("Invalid router rule: %v", err)
- return nil
- }
- if rule.Type == "field" {
- fieldrule := new(FieldRule)
- err = json.Unmarshal(msg, fieldrule)
- if err != nil {
- log.Error("Invalid field rule: %v", err)
- return nil
- }
- return fieldrule
- }
- if rule.Type == "chinaip" {
- chinaiprule := new(ChinaIPRule)
- if err := json.Unmarshal(msg, chinaiprule); err != nil {
- log.Error("Invalid chinaip rule: %v", err)
- return nil
- }
- return chinaiprule
- }
- if rule.Type == "chinasites" {
- chinasitesrule := new(ChinaSitesRule)
- if err := json.Unmarshal(msg, chinasitesrule); err != nil {
- log.Error("Invalid chinasites rule: %v", err)
- return nil
- }
- return chinasitesrule
- }
- log.Error("Unknown router rule type: %s", rule.Type)
- return nil
- }
- func (this *RouterRuleConfig) Rules() []rules.Rule {
- rules := make([]rules.Rule, len(this.RuleList))
- for idx, rawRule := range this.RuleList {
- rules[idx] = parseRule(rawRule)
- }
- return rules
- }
- func init() {
- v2routerjson.RegisterRouterConfig("rules", func() interface{} {
- return new(RouterRuleConfig)
- })
- }
|