From 95a465b4b5324acaa5d9cf6733fd019dde718de0 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Fri, 13 Jan 2023 09:33:59 -0500 Subject: [PATCH] feat: add FlagNamer option Fixes #347 --- build.go | 2 +- kong.go | 4 ++++ kong_test.go | 10 +++++----- options.go | 8 ++++++++ options_test.go | 10 ++++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/build.go b/build.go index be7679e..0a23fd0 100644 --- a/build.go +++ b/build.go @@ -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 } diff --git a/kong.go b/kong.go index 1ae9188..70e8906 100644 --- a/kong.go +++ b/kong.go @@ -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)) diff --git a/kong_test.go b/kong_test.go index 3d8a617..53e064b 100644 --- a/kong_test.go +++ b/kong_test.go @@ -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)) diff --git a/options.go b/options.go index ec724b0..8633f68 100644 --- a/options.go +++ b/options.go @@ -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 + }) +} diff --git a/options_test.go b/options_test.go index a77853a..2dbd0ba 100644 --- a/options_test.go +++ b/options_test.go @@ -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) +}