github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/app/subscription/entries/register.go (about) 1 package entries 2 3 import "github.com/v2fly/v2ray-core/v5/app/subscription/specs" 4 5 type ConverterRegistry struct { 6 knownConverters map[string]Converter 7 parent *ConverterRegistry 8 } 9 10 var globalConverterRegistry = &ConverterRegistry{knownConverters: map[string]Converter{}} 11 12 func RegisterConverter(kind string, converter Converter) error { 13 return globalConverterRegistry.RegisterConverter(kind, converter) 14 } 15 16 func GetOverlayConverterRegistry() *ConverterRegistry { 17 return globalConverterRegistry.GetOverlayConverterRegistry() 18 } 19 20 func (c *ConverterRegistry) RegisterConverter(kind string, converter Converter) error { 21 if _, found := c.knownConverters[kind]; found { 22 return newError("converter already registered for kind ", kind) 23 } 24 c.knownConverters[kind] = converter 25 return nil 26 } 27 28 func (c *ConverterRegistry) TryAllConverters(rawConfig []byte, prioritizedConverter, kindHint string) (*specs.SubscriptionServerConfig, error) { 29 if prioritizedConverter != "" { 30 if converter, found := c.knownConverters[prioritizedConverter]; found { 31 serverConfig, err := converter.ConvertToAbstractServerConfig(rawConfig, kindHint) 32 if err == nil { 33 return serverConfig, nil 34 } 35 } 36 } 37 38 for _, converter := range c.knownConverters { 39 serverConfig, err := converter.ConvertToAbstractServerConfig(rawConfig, kindHint) 40 if err == nil { 41 return serverConfig, nil 42 } 43 } 44 if c.parent != nil { 45 if serverConfig, err := c.parent.TryAllConverters(rawConfig, prioritizedConverter, kindHint); err == nil { 46 return serverConfig, nil 47 } 48 } 49 return nil, newError("no converter found for config") 50 } 51 52 func (c *ConverterRegistry) GetOverlayConverterRegistry() *ConverterRegistry { 53 return &ConverterRegistry{knownConverters: map[string]Converter{}, parent: c} 54 }