github.com/eagleql/xray-core@v1.4.4/common/type.go (about)

     1  package common
     2  
     3  import (
     4  	"context"
     5  	"reflect"
     6  )
     7  
     8  // ConfigCreator is a function to create an object by a config.
     9  type ConfigCreator func(ctx context.Context, config interface{}) (interface{}, error)
    10  
    11  var (
    12  	typeCreatorRegistry = make(map[reflect.Type]ConfigCreator)
    13  )
    14  
    15  // RegisterConfig registers a global config creator. The config can be nil but must have a type.
    16  func RegisterConfig(config interface{}, configCreator ConfigCreator) error {
    17  	configType := reflect.TypeOf(config)
    18  	if _, found := typeCreatorRegistry[configType]; found {
    19  		return newError(configType.Name() + " is already registered").AtError()
    20  	}
    21  	typeCreatorRegistry[configType] = configCreator
    22  	return nil
    23  }
    24  
    25  // CreateObject creates an object by its config. The config type must be registered through RegisterConfig().
    26  func CreateObject(ctx context.Context, config interface{}) (interface{}, error) {
    27  	configType := reflect.TypeOf(config)
    28  	creator, found := typeCreatorRegistry[configType]
    29  	if !found {
    30  		return nil, newError(configType.String() + " is not registered").AtError()
    31  	}
    32  	return creator(ctx, config)
    33  }