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  }