package envflag import ( "flag" "fmt" "os" "strconv" ) // String is a convent way to set value from environment variable, // and allow override when a command line flag is set. It's assumed `p` is // not nil. func String(fl *flag.FlagSet, p *string, name, envvar, usage string) { if v := os.Getenv(envvar); v != "" { *p = v } fl.StringVar(p, name, *p, fmt.Sprintf("%s (Environ: '%s')", usage, envvar)) } // Bool is a convent way to set value from environment variable, // and allow override when a command line flag is set. It's assumed `p` is // not nil. func Bool(fl *flag.FlagSet, p *bool, name, envvar, usage string) error { if v := os.Getenv(envvar); v != "" { res, err := strconv.ParseBool(v) if err != nil { return fmt.Errorf("Bool: cannot parse '%s=%s', %w", envvar, v, err) } *p = res } fl.BoolVar(p, name, *p, fmt.Sprintf("%s (Environ: '%s')", usage, envvar)) return nil } // Int is a convent way to set value from environment variable, // and allow override when a command line flag is set. It's assumed `p` is // not nil. func Int(fl *flag.FlagSet, p *int, name, envvar, usage string) error { if v := os.Getenv(envvar); v != "" { res, err := strconv.ParseInt(v, 10, 32) if err != nil { return fmt.Errorf("Int: cannot parse '%s=%s', %w", envvar, v, err) } *p = int(res) } fl.IntVar(p, name, *p, fmt.Sprintf("%s (Environ: '%s')", usage, envvar)) return nil }