in cmd/root.go [547:597]
func loadConfig(c *Command, args []string, opts []Option) error {
v, err := initViper(c)
if err != nil {
return err
}
c.Flags().VisitAll(func(f *pflag.Flag) {
// Override any unset flags with Viper values to use the pflags
// object as a single source of truth.
if !f.Changed && v.IsSet(f.Name) {
val := v.Get(f.Name)
_ = c.Flags().Set(f.Name, fmt.Sprintf("%v", val))
}
})
// If args is not already populated, try to read from the environment.
if len(args) == 0 {
args = instanceFromEnv(args)
}
// If no environment args are present, try to read from the config file.
if len(args) == 0 {
args = instanceFromConfigFile(v)
}
for _, o := range opts {
o(c)
}
// Handle logger separately from config
if c.conf.StructuredLogs {
c.logger, c.cleanup = log.NewStructuredLogger(c.conf.Quiet)
}
if c.conf.Quiet {
c.logger = log.NewStdLogger(io.Discard, os.Stderr)
}
err = parseConfig(c, c.conf, args)
if err != nil {
return err
}
// The arguments are parsed. Usage is no longer needed.
c.SilenceUsage = true
// Errors will be handled by logging from here on.
c.SilenceErrors = true
return nil
}