Files
sultan/pkg/cli/env.go
T
br ca6cdcca63 software steht so weit.
jetzt build + docker build und testen
2026-10-02 13:25:34 +02:00

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
}