mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-02-20 23:47:21 -05:00
added implementation registry
This commit is contained in:
parent
18b90d13df
commit
1e562e7dd5
9
common/registry/errors.generated.go
Normal file
9
common/registry/errors.generated.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package registry
|
||||||
|
|
||||||
|
import "github.com/v2fly/v2ray-core/v4/common/errors"
|
||||||
|
|
||||||
|
type errPathObjHolder struct{}
|
||||||
|
|
||||||
|
func newError(values ...interface{}) *errors.Error {
|
||||||
|
return errors.New(values...).WithPathObj(errPathObjHolder{})
|
||||||
|
}
|
39
common/registry/implementation_set.go
Normal file
39
common/registry/implementation_set.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package registry
|
||||||
|
|
||||||
|
import "github.com/v2fly/v2ray-core/v4/common/protoext"
|
||||||
|
|
||||||
|
//go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen
|
||||||
|
|
||||||
|
type implementationSet struct {
|
||||||
|
AliasLookup map[string]*implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
type implementation struct {
|
||||||
|
FullName string
|
||||||
|
Alias []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *implementationSet) RegisterImplementation(name string, opt *protoext.MessageOpt) {
|
||||||
|
alias := opt.GetShortName()
|
||||||
|
|
||||||
|
impl := &implementation{
|
||||||
|
FullName: name,
|
||||||
|
Alias: alias,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, aliasName := range alias {
|
||||||
|
i.AliasLookup[aliasName] = impl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *implementationSet) FindImplementationByAlias(alias string) (string, error) {
|
||||||
|
impl, found := i.AliasLookup[alias]
|
||||||
|
if found {
|
||||||
|
return impl.FullName, nil
|
||||||
|
}
|
||||||
|
return "", newError("cannot find implementation by alias")
|
||||||
|
}
|
||||||
|
|
||||||
|
func newImplementationSet() *implementationSet {
|
||||||
|
return &implementationSet{AliasLookup: map[string]*implementation{}}
|
||||||
|
}
|
49
common/registry/registry.go
Normal file
49
common/registry/registry.go
Normal file
@ -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)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user