From 5157e5fffe80c3f51af940ad09042bfa362f1b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E3=81=AE=E3=81=8B=E3=81=88=E3=81=A7?= Date: Thu, 21 Jul 2022 21:56:50 +0800 Subject: [PATCH] Fix: load auto format config with io.Reader (#1773) --- config.go | 39 +++++++++++++++++++++++++-------- infra/conf/jsonpb/jsonpb.go | 2 ++ infra/conf/v2jsonpb/v2jsonpb.go | 2 ++ infra/conf/v5cfg/init.go | 2 ++ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/config.go b/config.go index 8bd5f1d66..506add468 100644 --- a/config.go +++ b/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() } diff --git a/infra/conf/jsonpb/jsonpb.go b/infra/conf/jsonpb/jsonpb.go index 27b4b74c7..54dbca3fe 100644 --- a/infra/conf/jsonpb/jsonpb.go +++ b/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 { diff --git a/infra/conf/v2jsonpb/v2jsonpb.go b/infra/conf/v2jsonpb/v2jsonpb.go index d383a34e5..1e57f5b89 100644 --- a/infra/conf/v2jsonpb/v2jsonpb.go +++ b/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 { diff --git a/infra/conf/v5cfg/init.go b/infra/conf/v5cfg/init.go index a357c86ad..2fe1d44ff 100644 --- a/infra/conf/v5cfg/init.go +++ b/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,