Skip to content

Commit b2ab3a0

Browse files
committed
add env var defaults
1 parent 6005355 commit b2ab3a0

File tree

7 files changed

+45
-19
lines changed

7 files changed

+45
-19
lines changed

command_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ func ExampleNewCommand() {
2626
// server v0.1.0: An http server.
2727
//
2828
// Usage:
29-
// server [flags] [sub-commands]
29+
// server [flags] [sub-command]
3030
//
31-
// Sub-commands:
31+
// Sub-command:
3232
// proxy: Proxy requests to another server.
3333
//
3434
// Flags:

flag.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ import (
1111
const helpFlagName = "help"
1212

1313
type Flag struct {
14-
name string
15-
description string
16-
aliases []string
17-
shorts []rune
18-
isHelp bool
19-
isVersion bool
20-
isHidden bool
21-
isInherited bool
22-
parser argParser
23-
defaultValue any
14+
name string
15+
description string
16+
aliases []string
17+
shorts []rune
18+
isHelp bool
19+
isVersion bool
20+
isHidden bool
21+
isInherited bool
22+
parser argParser
23+
defaultEnvName string
24+
defaultValue any
2425

2526
value any
2627
}

flag_options.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package cli
22

33
import (
4+
"os"
5+
6+
"github.com/bobg/errors"
47
"github.com/broothie/option"
58
)
69

@@ -46,6 +49,7 @@ func SetFlagDefault[T Parseable](defaultValue T) option.Func[*Flag] {
4649

4750
flag.parser = argParser
4851
flag.defaultValue = defaultValue
52+
flag.defaultEnvName = ""
4953
return flag, nil
5054
}
5155
}
@@ -55,6 +59,22 @@ func SetFlagDefaultAndParser[T any](defaultValue T, argParser ArgParser[T]) opti
5559
return func(flag *Flag) (*Flag, error) {
5660
flag.parser = argParser
5761
flag.defaultValue = defaultValue
62+
flag.defaultEnvName = ""
63+
return flag, nil
64+
}
65+
}
66+
67+
// SetFlagDefaultEnvAndParser sets the default value to that of the corresponding environment variable, and parser of the flag.
68+
func SetFlagDefaultEnvAndParser[T any](name string, argParser ArgParser[T]) option.Func[*Flag] {
69+
return func(flag *Flag) (*Flag, error) {
70+
defaultValue, err := argParser(os.Getenv(name))
71+
if err != nil {
72+
return nil, errors.Wrapf(err, "parsing value of $%s", name)
73+
}
74+
75+
flag.parser = argParser
76+
flag.defaultValue = defaultValue
77+
flag.defaultEnvName = name
5878
return flag, nil
5979
}
6080
}

help.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,17 @@ func (h helpContext) FlagTable() (string, error) {
104104
shorts = fmt.Sprintf("-%s", string(flag.shorts))
105105
}
106106

107+
defaultValueHelp := fmt.Sprintf("%q", fmt.Sprint(flag.defaultValue))
108+
if flag.defaultEnvName != "" {
109+
defaultValueHelp = fmt.Sprintf("$%s", flag.defaultEnvName)
110+
}
111+
107112
return []string{
108113
"",
109114
strings.Join(longs, " "),
110115
shorts,
111116
flag.description,
112-
fmt.Sprintf("(type: %T, default: %q)", flag.parser.Type(), fmt.Sprint(flag.defaultValue)),
117+
fmt.Sprintf("(type: %T, default: %s)", flag.parser.Type(), defaultValueHelp),
113118
}, true
114119
}))
115120
}

help.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{{.RootName}}{{ if .Version }} {{.Version}}{{ end }}: {{.RootDescription}}
22

33
Usage:
4-
{{.QualifiedName}} {{- if .Flags }} [flags]{{ end -}} {{- if .SubCommands }} [sub-commands]{{ end }}{{ if .ArgumentList }} {{.ArgumentList}}{{ end }}
4+
{{.QualifiedName}} {{- if .Flags }} [flags]{{ end -}} {{- if .SubCommands }} [sub-command]{{ end }}{{ if .ArgumentList }} {{.ArgumentList}}{{ end }}
55

66
{{ if .SubCommands -}}
7-
Sub-commands:
7+
Sub-command:
88
{{.SubCommandsTable}}
99
{{ end -}}
1010

help_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ func TestCommand_renderHelp(t *testing.T) {
8484
test v1.2.3-rc10: test command
8585
8686
Usage:
87-
test [flags] [sub-commands]
87+
test [flags] [sub-command]
8888
89-
Sub-commands:
89+
Sub-command:
9090
some-command: some command
9191
9292
Flags:

options_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ func ExampleAddSubCmd() {
126126
// server: An http server.
127127
//
128128
// Usage:
129-
// server [sub-commands]
129+
// server [sub-command]
130130
//
131-
// Sub-commands:
131+
// Sub-command:
132132
// start: Start the server
133133
}
134134

0 commit comments

Comments
 (0)