github.com/ipfans/trojan-go@v0.11.0/config/config.go (about)

     1  package config
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  
     7  	"gopkg.in/yaml.v3"
     8  )
     9  
    10  var creators = make(map[string]Creator)
    11  
    12  // Creator creates default config struct for a module
    13  type Creator func() interface{}
    14  
    15  // RegisterConfigCreator registers a config struct for parsing
    16  func RegisterConfigCreator(name string, creator Creator) {
    17  	name += "_CONFIG"
    18  	creators[name] = creator
    19  }
    20  
    21  func parseJSON(data []byte) (map[string]interface{}, error) {
    22  	result := make(map[string]interface{})
    23  	for name, creator := range creators {
    24  		config := creator()
    25  		if err := json.Unmarshal(data, config); err != nil {
    26  			return nil, err
    27  		}
    28  		result[name] = config
    29  	}
    30  	return result, nil
    31  }
    32  
    33  func parseYAML(data []byte) (map[string]interface{}, error) {
    34  	result := make(map[string]interface{})
    35  	for name, creator := range creators {
    36  		config := creator()
    37  		if err := yaml.Unmarshal(data, config); err != nil {
    38  			return nil, err
    39  		}
    40  		result[name] = config
    41  	}
    42  	return result, nil
    43  }
    44  
    45  func WithJSONConfig(ctx context.Context, data []byte) (context.Context, error) {
    46  	var configs map[string]interface{}
    47  	var err error
    48  	configs, err = parseJSON(data)
    49  	if err != nil {
    50  		return ctx, err
    51  	}
    52  	for name, config := range configs {
    53  		ctx = context.WithValue(ctx, name, config)
    54  	}
    55  	return ctx, nil
    56  }
    57  
    58  func WithYAMLConfig(ctx context.Context, data []byte) (context.Context, error) {
    59  	var configs map[string]interface{}
    60  	var err error
    61  	configs, err = parseYAML(data)
    62  	if err != nil {
    63  		return ctx, err
    64  	}
    65  	for name, config := range configs {
    66  		ctx = context.WithValue(ctx, name, config)
    67  	}
    68  	return ctx, nil
    69  }
    70  
    71  func WithConfig(ctx context.Context, name string, cfg interface{}) context.Context {
    72  	name += "_CONFIG"
    73  	return context.WithValue(ctx, name, cfg)
    74  }
    75  
    76  // FromContext extracts config from a context
    77  func FromContext(ctx context.Context, name string) interface{} {
    78  	return ctx.Value(name + "_CONFIG")
    79  }