package config import ( "fmt" "io" "os" ) type ParseMethod func(r io.Reader) (Config, error) var ( methods = make(map[string]ParseMethod) ) func RegisterParseMethod(name string, method ParseMethod) { methods[name] = method } func FromReader(methodName string, r io.Reader) (res Config, err error) { method, check := methods[methodName] if !check { return nil, fmt.Errorf("UNEXPECTED METHOD [%v]", methodName) } return method(r) } func FromFile(methodName, filePath string) (res Config, err error) { method, check := methods[methodName] if !check { return nil, fmt.Errorf("UNEXPECTED METHOD [%v]", methodName) } var f *os.File if f, err = os.Open(filePath); err != nil { return } defer f.Close() return method(f) }