From b368ac3b7c9b73d96ebf8fb5a91fdee6be6226ec Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Tue, 7 Sep 2021 13:02:09 +0100 Subject: [PATCH] added general purpose tagged features config loader --- common/taggedfeatures/configloader.go | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 common/taggedfeatures/configloader.go diff --git a/common/taggedfeatures/configloader.go b/common/taggedfeatures/configloader.go new file mode 100644 index 000000000..14728bf23 --- /dev/null +++ b/common/taggedfeatures/configloader.go @@ -0,0 +1,35 @@ +package taggedfeatures + +import ( + "context" + "encoding/json" + "github.com/v2fly/v2ray-core/v4/common/serial" + "github.com/v2fly/v2ray-core/v4/infra/conf/v5cfg" + "google.golang.org/protobuf/types/known/anypb" +) + +func LoadJsonConfig(ctx context.Context, interfaceType, defaultImpl string, message json.RawMessage) (*Config, error) { + type ItemStub struct { + MemberType string `json:"type"` + Tag string `json:"tag"` + Value json.RawMessage `json:"settings"` + } + type namedStub []ItemStub + var stub namedStub + err := json.Unmarshal(message, &stub) + if err != nil { + return nil, err + } + config := &Config{Features: map[string]*anypb.Any{}} + for _, v := range stub { + if v.MemberType == "" { + v.MemberType = defaultImpl + } + pack, err := v5cfg.LoadHeterogeneousConfigFromRawJson(ctx, interfaceType, v.MemberType, v.Value) + if err != nil { + return nil, err + } + config.Features[v.Tag] = serial.ToTypedMessage(pack) + } + return config, nil +}