From 34f43e6f4fce4fe271b08e6a6b6239f6e7d18fdc Mon Sep 17 00:00:00 2001 From: David Orchard Date: Thu, 12 Jun 2025 13:05:30 -0700 Subject: [PATCH] Improve type naming when using pflag --- flagset.go | 8 ++++++ flagset_test.go | 75 ++++++++++++++++++++++++++++++++++++++----------- go.mod | 1 + go.sum | 2 ++ simple.go | 4 +++ 5 files changed, 74 insertions(+), 16 deletions(-) diff --git a/flagset.go b/flagset.go index 2d80bab..93b6516 100644 --- a/flagset.go +++ b/flagset.go @@ -667,6 +667,10 @@ func (s *strSliceVar) Set(val string) error { return nil } +func (s *strSliceVar) Type() string { + return getTypeName(reflect.TypeOf(s.ref)) +} + func parseStringSlice(val string, valueSplitPattern string) []string { if valueSplitPattern == "" { return []string{val} @@ -718,6 +722,10 @@ func (s strToStrMapVar) Set(val string) error { return nil } +func (s strToStrMapVar) Type() string { + return getTypeName(reflect.TypeOf(s.val)) +} + func parseStringToStringMap(val string) map[string]string { result := make(map[string]string) diff --git a/flagset_test.go b/flagset_test.go index a707638..93390f2 100644 --- a/flagset_test.go +++ b/flagset_test.go @@ -4,6 +4,7 @@ import ( "bytes" "flag" "fmt" + "io" "os" "reflect" "strconv" @@ -12,6 +13,7 @@ import ( "github.com/iancoleman/strcase" "github.com/itzg/go-flagsfiller" + "github.com/spf13/pflag" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -148,7 +150,7 @@ func TestUsage(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -multi-word-name string @@ -377,7 +379,7 @@ func TestNumbers(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -val-float-64 float @@ -421,7 +423,7 @@ func TestDefaultsViaLiteral(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, "un-exported", config.Nested.unExported) @@ -452,7 +454,7 @@ func TestDefaultsViaTag(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -enabled @@ -482,7 +484,7 @@ func TestSimpleTypeDefaultsViaTag(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -count value @@ -571,7 +573,7 @@ func TestStringSlice(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -instance-default value @@ -639,7 +641,7 @@ func TestStringToStringMap(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) // using regexp assertion since -tag-default's map entries can be either order assert.Regexp(t, ` @@ -675,7 +677,7 @@ func TestUsagePlaceholders(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -some-url URL @@ -722,7 +724,7 @@ func TestIgnoreNonExportedFields(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -host string @@ -745,7 +747,7 @@ func TestIgnoreNonExportedStructFields(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -host string @@ -770,7 +772,7 @@ func TestWithEnv(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -host string @@ -799,7 +801,7 @@ func TestWithEnvOverride(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -host string @@ -820,7 +822,7 @@ func TestWithEnvOverrideDisable(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -host string @@ -846,7 +848,7 @@ func TestNoSetFromEnv(t *testing.T) { err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Empty(t, config.Host) @@ -869,7 +871,7 @@ func TestFlagNameOverride(t *testing.T) { var flagset flag.FlagSet err := filler.Fill(&flagset, &config) require.NoError(t, err) - buf := grabUsage(flagset) + buf := grabUsage(&flagset) assert.Equal(t, ` -server_address string @@ -878,7 +880,12 @@ func TestFlagNameOverride(t *testing.T) { } -func grabUsage(flagset flag.FlagSet) *bytes.Buffer { +type flagSet interface { + SetOutput(io.Writer) + PrintDefaults() +} + +func grabUsage(flagset flagSet) *bytes.Buffer { var buf bytes.Buffer buf.Write([]byte{'\n'}) // start with newline to make expected string nicer below @@ -909,3 +916,39 @@ func ExampleWithEnv() { // Output: // from env } + +func TestTypeNamesWithPFlag(t *testing.T) { + type Config struct { + Enabled bool + Timeout time.Duration + Count int16 + Hosts []string + Map map[string]string + } + + flagsfiller.RegisterSimpleType(func(s string, tag reflect.StructTag) (int16, error) { + i, err := strconv.ParseInt(s, 10, 16) + return int16(i), err + }) + + var config Config + + filler := flagsfiller.New() + + var flagset flag.FlagSet + err := filler.Fill(&flagset, &config) + require.NoError(t, err) + + var pflagSet pflag.FlagSet + pflagSet.AddGoFlagSet(&flagset) + + buf := grabUsage(&pflagSet) + + assert.Equal(t, ` + --count int16 + --enabled + --hosts []string + --map map[string]string + --timeout duration (default 0s) +`, buf.String()) +} diff --git a/go.mod b/go.mod index 83689d8..f7eb761 100644 --- a/go.mod +++ b/go.mod @@ -10,5 +10,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index db94a71..0d293f4 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSAS github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/simple.go b/simple.go index 1771e73..a17aebb 100644 --- a/simple.go +++ b/simple.go @@ -48,6 +48,10 @@ func (v *simpleType[T]) Set(s string) error { return nil } +func (v *simpleType[T]) Type() string { + return getTypeName(reflect.TypeOf(*new(T))) +} + func (v *simpleType[T]) SetRef(t *T) { v.val = t }