|  | @@ -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)
 | 
											
												
													
														|  | 
 |  | +	})
 | 
											
												
													
														|  | 
 |  | +}
 |