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_. 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 }