52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package cli
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// envName bildet einen Flag-Namen auf seine Umgebungsvariable ab:
|
|
// public-url → SULTAN_PUBLIC_URL.
|
|
func envName(flagName string) string {
|
|
return "SULTAN_" + strings.ToUpper(strings.ReplaceAll(flagName, "-", "_"))
|
|
}
|
|
|
|
// annotateEnv ergänzt die Hilfe jedes Flags um den Namen der Variable.
|
|
func annotateEnv(fs *flag.FlagSet) {
|
|
fs.VisitAll(func(f *flag.Flag) { f.Usage += " [" + envName(f.Name) + "]" })
|
|
}
|
|
|
|
// applyEnv setzt nach fs.Parse alle Flags, die nicht auf der Befehlszeile
|
|
// standen, aus SULTAN_<FLAG>. Flags gewinnen also; Listen-Flags werden aus
|
|
// kommagetrennten Werten gefüllt (und von einem Flag ersetzt, nicht ergänzt).
|
|
func applyEnv(fs *flag.FlagSet, getenv func(string) string) error {
|
|
explicit := map[string]bool{}
|
|
fs.Visit(func(f *flag.Flag) { explicit[f.Name] = true })
|
|
var err error
|
|
fs.VisitAll(func(f *flag.Flag) {
|
|
if err != nil || explicit[f.Name] {
|
|
return
|
|
}
|
|
name := envName(f.Name)
|
|
v := strings.TrimSpace(getenv(name))
|
|
if v == "" {
|
|
return
|
|
}
|
|
values := []string{v}
|
|
if _, isList := f.Value.(*stringList); isList {
|
|
values = strings.Split(v, ",")
|
|
}
|
|
for _, item := range values {
|
|
if item = strings.TrimSpace(item); item == "" {
|
|
continue
|
|
}
|
|
if e := f.Value.Set(item); e != nil {
|
|
err = fmt.Errorf("%s=%q: %w", name, v, e)
|
|
return
|
|
}
|
|
}
|
|
})
|
|
return err
|
|
}
|