35 lines
1,015 B
Go
35 lines
1,015 B
Go
|
package flag
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// SetFlagsFromEnv parses all registered flags in the given flagset,
|
||
|
// and if they are not already set it attempts to set their values from
|
||
|
// environment variables. Environment variables take the name of the flag but
|
||
|
// are UPPERCASE, and any dashes are replaced by underscores. Environment
|
||
|
// variables additionally are prefixed by the given string followed by
|
||
|
// and underscore. For example, if prefix=PREFIX: some-flag => PREFIX_SOME_FLAG
|
||
|
func SetFlagsFromEnv(fs *flag.FlagSet, prefix string) error {
|
||
|
var err error
|
||
|
alreadySet := make(map[string]bool)
|
||
|
fs.Visit(func(f *flag.Flag) {
|
||
|
alreadySet[f.Name] = true
|
||
|
})
|
||
|
fs.VisitAll(func(f *flag.Flag) {
|
||
|
if !alreadySet[f.Name] {
|
||
|
key := prefix + "_" + strings.ToUpper(strings.Replace(f.Name, "-", "_", -1))
|
||
|
val := os.Getenv(key)
|
||
|
if val != "" {
|
||
|
if serr := fs.Set(f.Name, val); serr != nil {
|
||
|
err = fmt.Errorf("invalid value %q for %s: %v", val, key, serr)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
return err
|
||
|
}
|