|
|
@@ -0,0 +1,49 @@
|
|
|
+package registry
|
|
|
+
|
|
|
+import (
|
|
|
+ "github.com/v2fly/v2ray-core/v4/common/protoext"
|
|
|
+ "google.golang.org/protobuf/proto"
|
|
|
+)
|
|
|
+
|
|
|
+type implementationRegistry struct {
|
|
|
+ implSet map[string]*implementationSet
|
|
|
+}
|
|
|
+
|
|
|
+func (i *implementationRegistry) RegisterImplementation(name string, opt *protoext.MessageOpt) {
|
|
|
+ interfaceType := opt.GetType()[0]
|
|
|
+ implSet, found := i.implSet[interfaceType]
|
|
|
+ if !found {
|
|
|
+ implSet = newImplementationSet()
|
|
|
+ i.implSet[interfaceType] = implSet
|
|
|
+ }
|
|
|
+ implSet.RegisterImplementation(name, opt)
|
|
|
+}
|
|
|
+
|
|
|
+func (i *implementationRegistry) FindImplementationByAlias(interfaceType, alias string) (string, error) {
|
|
|
+ implSet, found := i.implSet[interfaceType]
|
|
|
+ if !found {
|
|
|
+ return "", newError("cannot find implemention unknown interface type")
|
|
|
+ }
|
|
|
+ return implSet.FindImplementationByAlias(alias)
|
|
|
+}
|
|
|
+
|
|
|
+func newImplementationRegistry() *implementationRegistry {
|
|
|
+ return &implementationRegistry{implSet: map[string]*implementationSet{}}
|
|
|
+}
|
|
|
+
|
|
|
+var globalImplementationRegistry = newImplementationRegistry()
|
|
|
+
|
|
|
+func RegisterImplementation(proto proto.Message) error {
|
|
|
+ msgDesc := proto.ProtoReflect().Type().Descriptor()
|
|
|
+ fullName := string(msgDesc.FullName())
|
|
|
+ msgOpts, err := protoext.GetMessageOptions(msgDesc)
|
|
|
+ if err != nil {
|
|
|
+ return newError("unable to find message options").Base(err)
|
|
|
+ }
|
|
|
+ globalImplementationRegistry.RegisterImplementation(fullName, msgOpts)
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func FindImplementationByAlias(interfaceType, alias string) (string, error) {
|
|
|
+ return globalImplementationRegistry.FindImplementationByAlias(interfaceType, alias)
|
|
|
+}
|