mirror of https://github.com/dexidp/dex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
1015 B
34 lines
1015 B
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 |
|
}
|
|
|