diff --git a/config/config.go b/config/config.go index 4798c01c..f9fd87fe 100644 --- a/config/config.go +++ b/config/config.go @@ -145,7 +145,7 @@ type AutherConfig struct { type AuthConfig struct { Username string `yaml:",omitempty" json:"username,omitempty"` Password string `yaml:",omitempty" json:"password,omitempty"` - File string `yaml:",omitempty" json:"file,omitempty"` + File string `yaml:",omitempty" json:"file,omitempty"` } type SelectorConfig struct { @@ -578,7 +578,8 @@ func (c *Config) Load() error { return v.Unmarshal(c) } -func (c *Config) Read(r io.Reader) error { +func (c *Config) Read(r io.Reader, configType string) error { + v.SetConfigType(configType) if err := v.ReadConfig(r); err != nil { return err } diff --git a/config/parsing/parser/parser.go b/config/parsing/parser/parser.go index 2a596429..91b996d5 100644 --- a/config/parsing/parser/parser.go +++ b/config/parsing/parser/parser.go @@ -1,6 +1,7 @@ package parser import ( + "bufio" "encoding/json" "os" "strings" @@ -43,15 +44,28 @@ type parser struct { func (p *parser) Parse() (*config.Config, error) { cfg := &config.Config{} - cfgFile := p.args.CfgFile - if cfgFile != "" { - cfgFile = strings.TrimSpace(cfgFile) - if strings.HasPrefix(cfgFile, "{") && strings.HasSuffix(cfgFile, "}") { + if cfgFile := strings.TrimSpace(p.args.CfgFile); cfgFile != "" { + if cfgFile == "-" { // stdin + br := bufio.NewReader(os.Stdin) + b, err := br.Peek(1) + if err != nil { + return nil, err + } + if b[0] == '{' { + if err := cfg.Read(br, "json"); err != nil { + return nil, err + } + } else { + if err := cfg.Read(br, "yaml"); err != nil { + return nil, err + } + } + } else if strings.HasPrefix(cfgFile, "{") && strings.HasSuffix(cfgFile, "}") { // inline if err := json.Unmarshal([]byte(cfgFile), cfg); err != nil { return nil, err } } else { - if err := cfg.ReadFile(cfgFile); err != nil { + if err := cfg.ReadFile(cfgFile); err != nil { // file return nil, err } }