From c9047cfbc62191ccbe47c2ca0896eb4b192a7223 Mon Sep 17 00:00:00 2001 From: Mitchell Riedstra Date: Sun, 27 Apr 2025 10:22:11 -0400 Subject: Initial --- go.mod | 3 +++ main.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 go.mod create mode 100644 main.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..87c20db --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module riedstra.dev/go/envflag + +go 1.11.0 diff --git a/main.go b/main.go new file mode 100644 index 0000000..8c50dc3 --- /dev/null +++ b/main.go @@ -0,0 +1,61 @@ +// Package envflag is an extremely small bit of code to make configuration +// via environment variables a little bit less of a hassle when using +// the flag package in the standard library. +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 +} -- cgit v1.2.3