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 }