浏览代码

Fix: load auto format config with io.Reader (#1773)

秋のかえで 3 年之前
父节点
当前提交
5157e5fffe
共有 4 个文件被更改,包括 36 次插入9 次删除
  1. 30 9
      config.go
  2. 2 0
      infra/conf/jsonpb/jsonpb.go
  3. 2 0
      infra/conf/v2jsonpb/v2jsonpb.go
  4. 2 0
      infra/conf/v5cfg/init.go

+ 30 - 9
config.go

@@ -135,18 +135,38 @@ func LoadConfig(formatName string, input interface{}) (*Config, error) {
 // * string of a single filename/url(s) to open to read
 // * io.Reader that reads a config content (the original way)
 func loadSingleConfigAutoFormat(input interface{}) (*Config, error) {
-	if file, ok := input.(cmdarg.Arg); ok {
-		extension := getExtension(file.String())
-		if extension != "" {
-			lowerName := strings.ToLower(extension)
-			if f, found := configLoaderByExt[lowerName]; found {
-				return f.Loader(file)
-			}
-			return nil, newError("config loader not found for: ", extension).AtWarning()
+	switch v := input.(type) {
+	case cmdarg.Arg:
+		return loadSingleConfigAutoFormatFromFile(v.String())
+	case string:
+		return loadSingleConfigByTryingAllLoaders(v)
+	case io.Reader:
+		data, err := buf.ReadAllToBytes(v)
+		if err != nil {
+			return nil, err
+		}
+		return loadSingleConfigByTryingAllLoaders(data)
+	default:
+		return loadSingleConfigByTryingAllLoaders(v)
+	}
+}
+
+func loadSingleConfigAutoFormatFromFile(file string) (*Config, error) {
+	extension := getExtension(file)
+	if extension != "" {
+		lowerName := strings.ToLower(extension)
+		if f, found := configLoaderByExt[lowerName]; found {
+			return f.Loader(file)
 		}
+		return nil, newError("config loader not found for: ", extension).AtWarning()
 	}
+
+	return loadSingleConfigByTryingAllLoaders(file)
+}
+
+func loadSingleConfigByTryingAllLoaders(input interface{}) (*Config, error) {
 	var errorReasons strings.Builder
-	// no extension, try all loaders
+
 	for _, f := range configLoaders {
 		if f.Name[0] == FormatAuto {
 			continue
@@ -157,6 +177,7 @@ func loadSingleConfigAutoFormat(input interface{}) (*Config, error) {
 		}
 		errorReasons.WriteString(fmt.Sprintf("unable to parse as %v:%v;", f.Name[0], err.Error()))
 	}
+
 	return nil, newError("tried all loaders but failed when attempting to parse: ", input, ";", errorReasons.String()).AtWarning()
 }
 

+ 2 - 0
infra/conf/jsonpb/jsonpb.go

@@ -57,6 +57,8 @@ func init() {
 					return nil, err
 				}
 				return loadJSONPB(bytes.NewReader(data))
+			case []byte:
+				return loadJSONPB(bytes.NewReader(v))
 			case io.Reader:
 				data, err := buf.ReadAllToBytes(v)
 				if err != nil {

+ 2 - 0
infra/conf/v2jsonpb/v2jsonpb.go

@@ -56,6 +56,8 @@ func init() {
 					return nil, err
 				}
 				return loadV2JsonPb(data)
+			case []byte:
+				return loadV2JsonPb(v)
 			case io.Reader:
 				data, err := buf.ReadAllToBytes(v)
 				if err != nil {

+ 2 - 0
infra/conf/v5cfg/init.go

@@ -40,6 +40,8 @@ func init() {
 					return nil, err
 				}
 				return loadJSONConfig(data)
+			case []byte:
+				return loadJSONConfig(v)
 			case io.Reader:
 				data, err := buf.ReadAllToBytes(&json.Reader{
 					Reader: v,