| 
					
				 | 
			
			
				@@ -0,0 +1,47 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"encoding/json" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	v2routerconfigjson "github.com/v2ray/v2ray-core/app/router/config/json" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"github.com/v2ray/v2ray-core/app/router/rules/config" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"github.com/v2ray/v2ray-core/common/log" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type RouterRuleConfig struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	RuleList []json.RawMessage `json:"rules"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func parseRule(msg json.RawMessage) config.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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	log.Error("Unknown router rule type: %s", rule.Type) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (this *RouterRuleConfig) Rules() []config.Rule { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	rules := make([]config.Rule, len(this.RuleList)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for idx, rawRule := range this.RuleList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		rules[idx] = parseRule(rawRule) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return rules 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func init() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	v2routerconfigjson.RegisterRouterConfig("rules", func() interface{} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return new(RouterRuleConfig) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |