register.go 1.7 KB

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