Skip to content

Commit 1d91c9b

Browse files
committed
feat!: pass Options to Usage
1 parent 1560cdb commit 1d91c9b

File tree

5 files changed

+24
-20
lines changed

5 files changed

+24
-20
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ var cfg struct {
227227
if err := env.Load(&cfg, nil); err != nil {
228228
fmt.Println(err)
229229
fmt.Println("Usage:")
230-
env.Usage(&cfg, os.Stdout)
230+
env.Usage(&cfg, os.Stdout, nil)
231231
}
232232
```
233233

@@ -238,12 +238,12 @@ Usage:
238238
HTTP_PORT int default 8080 http server port
239239
```
240240

241-
The format of the message can be customized by implementing the `Usage([]env.Var, io.Writer)` method:
241+
The format of the message can be customized by implementing the `Usage([]env.Var, io.Writer, *env.Options)` method:
242242

243243
```go
244-
type config struct{ ... }
244+
type Config struct{ ... }
245245

246-
func (config) Usage(vars []env.Var, w io.Writer) {
246+
func (Config) Usage(vars []env.Var, w io.Writer, opts *env.Options) {
247247
for v := range vars {
248248
// write to w.
249249
}

env_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestLoad(t *testing.T) {
3131
load := func() { _ = env.Load(cfg, &env.Options{Source: env.Map{}}) }
3232
assert.Panics[E](t, load, panicMsg)
3333

34-
usage := func() { env.Usage(cfg, io.Discard) }
34+
usage := func() { env.Usage(cfg, io.Discard, nil) }
3535
assert.Panics[E](t, usage, panicMsg)
3636
})
3737
}

example_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func ExampleUsage() {
146146
if err := env.Load(&cfg, nil); err != nil {
147147
fmt.Println(err)
148148
fmt.Println("Usage:")
149-
env.Usage(&cfg, os.Stdout)
149+
env.Usage(&cfg, os.Stdout, nil)
150150
}
151151

152152
// Output: env: DB_HOST DB_PORT are required but not set

usage.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import (
1313
// var cfg struct {
1414
// Port int `env:"PORT"`
1515
// }
16-
// env.Load(&cfg, nil) // 1. sets cfg.Port to 8080
17-
// env.Usage(&cfg, os.Stdout) // 2. prints cfg.Port's default == 8080 (instead of 0)
16+
// env.Load(&cfg, nil) // 1. sets cfg.Port to 8080
17+
// env.Usage(&cfg, os.Stdout, nil) // 2. prints cfg.Port's default == 8080 (instead of 0)
1818
//
1919
// It also speeds up [Usage], since there is no need to parse the struct again.
2020
var cache = make(map[reflect.Type][]Var)
@@ -34,8 +34,8 @@ type Var struct {
3434

3535
// Usage writes a usage message documenting all defined environment variables to the given [io.Writer].
3636
// An optional usage string can be added for each environment variable via the `usage:"STRING"` struct tag.
37-
// The format of the message can be customized by implementing the Usage([]env.Var, io.Writer) method on the cfg's type.
38-
func Usage(cfg any, w io.Writer) {
37+
// The format of the message can be customized by implementing the Usage([]env.Var, io.Writer, *env.Options) method on the cfg's type.
38+
func Usage(cfg any, w io.Writer, opts *Options) {
3939
pv := reflect.ValueOf(cfg)
4040
if !structPtr(pv) {
4141
panic("env: cfg must be a non-nil struct pointer")
@@ -47,14 +47,18 @@ func Usage(cfg any, w io.Writer) {
4747
vars = parseVars(v)
4848
}
4949

50-
if u, ok := cfg.(interface{ Usage([]Var, io.Writer) }); ok {
51-
u.Usage(vars, w)
50+
if u, ok := cfg.(interface {
51+
Usage([]Var, io.Writer, *Options)
52+
}); ok {
53+
u.Usage(vars, w, opts)
5254
} else {
53-
defaultUsage(vars, w)
55+
defaultUsage(vars, w, opts)
5456
}
5557
}
5658

57-
func defaultUsage(vars []Var, w io.Writer) {
59+
func defaultUsage(vars []Var, w io.Writer, _ *Options) {
60+
// TODO: use opts.SliceSep to parse slice values.
61+
5862
tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
5963
defer tw.Flush()
6064

usage_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ func TestUsage(t *testing.T) {
1616
var cfg struct {
1717
Foo string `env:"FOO" default:""`
1818
}
19-
env.Usage(&cfg, &buf)
19+
env.Usage(&cfg, &buf, nil)
2020
assert.Equal[E](t, buf.String(), " FOO string default <empty>\n")
2121
})
2222

2323
t.Run("custom usage message", func(t *testing.T) {
2424
var buf bytes.Buffer
25-
var cfg config
26-
env.Usage(&cfg, &buf)
25+
var cfg Config
26+
env.Usage(&cfg, &buf, nil)
2727
assert.Equal[E](t, buf.String(), "custom")
2828
})
2929

@@ -38,13 +38,13 @@ func TestUsage(t *testing.T) {
3838
assert.Equal[E](t, cfg.Foo, 1)
3939

4040
var buf bytes.Buffer
41-
env.Usage(&cfg, &buf)
41+
env.Usage(&cfg, &buf, nil)
4242
assert.Equal[E](t, buf.String(), " FOO int default 0\n")
4343
})
4444
}
4545

46-
type config struct{}
46+
type Config struct{}
4747

48-
func (config) Usage(_ []env.Var, w io.Writer) {
48+
func (Config) Usage(_ []env.Var, w io.Writer, _ *env.Options) {
4949
_, _ = w.Write([]byte("custom"))
5050
}

0 commit comments

Comments
 (0)