From 324f0abbf0c265cf69a45efb62fc53e57061e643 Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Sat, 4 Sep 2021 16:48:23 +0100 Subject: [PATCH] added heterogeneous configure file loader --- infra/conf/v5cfg/common.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 infra/conf/v5cfg/common.go diff --git a/infra/conf/v5cfg/common.go b/infra/conf/v5cfg/common.go new file mode 100644 index 000000000..9ba5feb08 --- /dev/null +++ b/infra/conf/v5cfg/common.go @@ -0,0 +1,37 @@ +package v5cfg + +import ( + "bytes" + "encoding/json" + "github.com/golang/protobuf/jsonpb" + "github.com/golang/protobuf/proto" + "github.com/v2fly/v2ray-core/v4/common/registry" + "github.com/v2fly/v2ray-core/v4/common/serial" + "strings" +) + +func loadHeterogeneousConfigFromRawJson(interfaceType, name string, rawJson json.RawMessage) (proto.Message, error) { + var implementationFullName string + if strings.HasPrefix(name, "#") { + // skip resolution for full name + implementationFullName = name + } else { + registryResult, err := registry.FindImplementationByAlias(interfaceType, name) + if err != nil { + return nil, newError("unable to find implementation").Base(err) + } + implementationFullName = registryResult + } + implementationConfigInstance, err := serial.GetInstance(implementationFullName) + if err != nil { + return nil, newError("unable to create implementation config instance").Base(err) + } + + unmarshaler := jsonpb.Unmarshaler{AllowUnknownFields: false} + err = unmarshaler.Unmarshal(bytes.NewReader([]byte(rawJson)), implementationConfigInstance.(proto.Message)) + if err != nil { + return nil, newError("unable to parse json content").Base(err) + } + + return implementationConfigInstance.(proto.Message), nil +}