feat: add FlagNamer option

Fixes #347
This commit is contained in:
Alec Thomas
2023-01-13 09:33:59 -05:00
parent 919e70103f
commit 95a465b4b5
5 changed files with 28 additions and 6 deletions
+1 -1
View File
@@ -133,7 +133,7 @@ MAIN:
tag := field.tag
name := tag.Name
if name == "" {
name = tag.Prefix + strings.ToLower(dashedString(ft.Name))
name = tag.Prefix + k.flagNamer(ft.Name)
} else {
name = tag.Prefix + name
}
+4
View File
@@ -65,6 +65,7 @@ type Kong struct {
helpFlag *Flag
groups []Group
vars Vars
flagNamer func(string) string
// Set temporarily by Options. These are applied after build().
postBuildOptions []Option
@@ -85,6 +86,9 @@ func New(grammar interface{}, options ...Option) (*Kong, error) {
bindings: bindings{},
helpFormatter: DefaultHelpValueFormatter,
ignoreFields: make([]*regexp.Regexp, 0),
flagNamer: func(s string) string {
return strings.ToLower(dashedString(s))
},
}
options = append(options, Bind(k))
+5 -5
View File
@@ -642,17 +642,17 @@ func TestRun(t *testing.T) {
func TestInterpolationIntoModel(t *testing.T) {
var cli struct {
Flag string `default:"${default}" help:"Help, I need ${somebody}" enum:"${enum}"`
Flag string `default:"${default_value}" help:"Help, I need ${somebody}" enum:"${enum}"`
EnumRef string `enum:"a,b" required:"" help:"One of ${enum}"`
EnvRef string `env:"${env}" help:"God ${env}"`
}
_, err := kong.New(&cli)
assert.Error(t, err)
p, err := kong.New(&cli, kong.Vars{
"default": "Some default value.",
"somebody": "chickens!",
"enum": "a,b,c,d",
"env": "SAVE_THE_QUEEN",
"default_value": "Some default value.",
"somebody": "chickens!",
"enum": "a,b,c,d",
"env": "SAVE_THE_QUEEN",
})
assert.NoError(t, err)
assert.Equal(t, 4, len(p.Model.Flags))
+8
View File
@@ -483,3 +483,11 @@ func DefaultEnvars(prefix string) Option {
return nil
})
}
// FlagNamer allows you to override the default kebab-case automated flag name generation.
func FlagNamer(namer func(fieldName string) string) Option {
return OptionFunc(func(k *Kong) error {
k.flagNamer = namer
return nil
})
}
+10
View File
@@ -2,6 +2,7 @@ package kong
import (
"reflect"
"strings"
"testing"
"github.com/alecthomas/assert/v2"
@@ -112,3 +113,12 @@ func TestBindToProvider(t *testing.T) {
assert.NoError(t, err)
assert.True(t, cli.Called)
}
func TestFlagNamer(t *testing.T) {
var cli struct {
SomeFlag string
}
app, err := New(&cli, FlagNamer(strings.ToUpper))
assert.NoError(t, err)
assert.Equal(t, "SOMEFLAG", app.Model.Flags[1].Name)
}