From 4a9fe056ead8eeff10f0c0401ea0368561e8ebe4 Mon Sep 17 00:00:00 2001 From: Chris Stephen Date: Tue, 5 Mar 2024 04:59:11 -0400 Subject: [PATCH] Support string pointers for path mapper (#360) --- mapper.go | 6 ++++++ mapper_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/mapper.go b/mapper.go index 5675754..14bd896 100644 --- a/mapper.go +++ b/mapper.go @@ -580,6 +580,12 @@ func pathMapper(r *Registry) MapperFunc { if target.Kind() == reflect.Slice { return sliceDecoder(r)(ctx, target) } + if target.Kind() == reflect.Ptr && target.Elem().Kind() == reflect.String { + if target.IsNil() { + return nil + } + target = target.Elem() + } if target.Kind() != reflect.String { return fmt.Errorf("\"path\" type must be applied to a string not %s", target.Type()) } diff --git a/mapper_test.go b/mapper_test.go index fc013bb..e054712 100644 --- a/mapper_test.go +++ b/mapper_test.go @@ -487,6 +487,49 @@ func TestFileContentMapper(t *testing.T) { assert.Contains(t, err.Error(), "is a directory") } +func TestPathMapperUsingStringPointer(t *testing.T) { + type CLI struct { + Path *string `type:"path"` + } + var cli CLI + + t.Run("With value", func(t *testing.T) { + p := mustNew(t, &cli) + _, err := p.Parse([]string{"--path", "/foo/bar"}) + assert.NoError(t, err) + assert.NotZero(t, cli.Path) + assert.Equal(t, "/foo/bar", *cli.Path) + }) + + t.Run("Zero value", func(t *testing.T) { + p := mustNew(t, &cli) + _, err := p.Parse([]string{"--path", ""}) + assert.NoError(t, err) + assert.NotZero(t, cli.Path) + wd, err := os.Getwd() + assert.NoError(t, err) + assert.Equal(t, wd, *cli.Path) + }) + + t.Run("Without value", func(t *testing.T) { + p := mustNew(t, &cli) + _, err := p.Parse([]string{"--"}) + assert.NoError(t, err) + assert.Equal(t, nil, cli.Path) + }) + + t.Run("Non-string pointer", func(t *testing.T) { + type CLI struct { + Path *any `type:"path"` + } + var cli CLI + p := mustNew(t, &cli) + _, err := p.Parse([]string{"--path", ""}) + assert.Error(t, err) + assert.Contains(t, err.Error(), `"path" type must be applied to a string`) + }) +} + //nolint:dupl func TestExistingFileMapper(t *testing.T) { type CLI struct {