mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-10-18 17:54:30 -04:00
55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
|
package entries
|
||
|
|
||
|
import "github.com/v2fly/v2ray-core/v5/app/subscription/specs"
|
||
|
|
||
|
type ConverterRegistry struct {
|
||
|
knownConverters map[string]Converter
|
||
|
parent *ConverterRegistry
|
||
|
}
|
||
|
|
||
|
var globalConverterRegistry = &ConverterRegistry{knownConverters: map[string]Converter{}}
|
||
|
|
||
|
func RegisterConverter(kind string, converter Converter) error {
|
||
|
return globalConverterRegistry.RegisterConverter(kind, converter)
|
||
|
}
|
||
|
|
||
|
func GetOverlayConverterRegistry() *ConverterRegistry {
|
||
|
return globalConverterRegistry.GetOverlayConverterRegistry()
|
||
|
}
|
||
|
|
||
|
func (c *ConverterRegistry) RegisterConverter(kind string, converter Converter) error {
|
||
|
if _, found := c.knownConverters[kind]; found {
|
||
|
return newError("converter already registered for kind ", kind)
|
||
|
}
|
||
|
c.knownConverters[kind] = converter
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *ConverterRegistry) TryAllConverters(rawConfig []byte, prioritizedConverter, kindHint string) (*specs.SubscriptionServerConfig, error) {
|
||
|
if prioritizedConverter != "" {
|
||
|
if converter, found := c.knownConverters[prioritizedConverter]; found {
|
||
|
serverConfig, err := converter.ConvertToAbstractServerConfig(rawConfig, kindHint)
|
||
|
if err == nil {
|
||
|
return serverConfig, nil
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, converter := range c.knownConverters {
|
||
|
serverConfig, err := converter.ConvertToAbstractServerConfig(rawConfig, kindHint)
|
||
|
if err == nil {
|
||
|
return serverConfig, nil
|
||
|
}
|
||
|
}
|
||
|
if c.parent != nil {
|
||
|
if serverConfig, err := c.parent.TryAllConverters(rawConfig, prioritizedConverter, kindHint); err == nil {
|
||
|
return serverConfig, nil
|
||
|
}
|
||
|
}
|
||
|
return nil, newError("no converter found for config")
|
||
|
}
|
||
|
|
||
|
func (c *ConverterRegistry) GetOverlayConverterRegistry() *ConverterRegistry {
|
||
|
return &ConverterRegistry{knownConverters: map[string]Converter{}, parent: c}
|
||
|
}
|