env.go 1010 B

123456789101112131415161718192021222324252627282930313233
  1. package flagutil
  2. import (
  3. "flag"
  4. "fmt"
  5. "os"
  6. "strings"
  7. )
  8. // SetFlagsFromEnv parses all registered flags in the given flagset,
  9. // and if they are not already set it attempts to set their values from
  10. // environment variables. Environment variables take the name of the flag but
  11. // are UPPERCASE, and any dashes are replaced by underscores. Environment
  12. // variables additionally are prefixed by the given string followed by
  13. // and underscore. For example, if prefix=PREFIX: some-flag => PREFIX_SOME_FLAG
  14. func SetFlagsFromEnv(fs *flag.FlagSet, prefix string) (err error) {
  15. alreadySet := make(map[string]bool)
  16. fs.Visit(func(f *flag.Flag) {
  17. alreadySet[f.Name] = true
  18. })
  19. fs.VisitAll(func(f *flag.Flag) {
  20. if !alreadySet[f.Name] {
  21. key := prefix + "_" + strings.ToUpper(strings.Replace(f.Name, "-", "_", -1))
  22. val := os.Getenv(key)
  23. if val != "" {
  24. if serr := fs.Set(f.Name, val); serr != nil {
  25. err = fmt.Errorf("invalid value %q for %s: %v", val, key, serr)
  26. }
  27. }
  28. }
  29. })
  30. return err
  31. }