Add Active member to Nodes and Values (#319)

This commit is contained in:
pyqlsa
2022-07-19 22:43:15 -07:00
committed by GitHub
parent f9bc630ef8
commit a05a0c20ba
4 changed files with 65 additions and 2 deletions
+2
View File
@@ -346,6 +346,7 @@ func (c *Context) endParsing() {
func (c *Context) trace(node *Node) (err error) { // nolint: gocyclo
positional := 0
node.Active = true
flags := []*Flag{}
flagNode := node
@@ -438,6 +439,7 @@ func (c *Context) trace(node *Node) (err error) { // nolint: gocyclo
c.endParsing()
}
arg.Active = true
err := arg.Parse(c.scan, c.getValue(arg))
if err != nil {
return err
+2 -2
View File
@@ -613,7 +613,7 @@ func existingFileMapper(r *Registry) MapperFunc {
return err
}
if ctx.Value.Set {
if !ctx.Value.Active || ctx.Value.Set {
// early return to avoid checking extra files that may not exist;
// this hack only works because the value provided on the cli is
// checked before the default value is checked (if default is set).
@@ -649,7 +649,7 @@ func existingDirMapper(r *Registry) MapperFunc {
return err
}
if ctx.Value.Set {
if !ctx.Value.Active || ctx.Value.Set {
// early return to avoid checking extra dirs that may not exist;
// this hack only works because the value provided on the cli is
// checked before the default value is checked (if default is set).
+58
View File
@@ -453,6 +453,35 @@ func TestExistingFileMapperDefaultMissing(t *testing.T) {
assert.NoError(t, err)
assert.NotZero(t, cli.File)
assert.Contains(t, cli.File, file)
p = mustNew(t, &cli)
_, err = p.Parse([]string{})
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing.txt: no such file or directory")
}
func TestExistingFileMapperDefaultMissingCmds(t *testing.T) {
type CLI struct {
CmdA struct {
FileA string `type:"existingfile" default:"testdata/aaa-missing.txt"`
FileB string `type:"existingfile" default:"testdata/bbb-missing.txt"`
} `cmd:""`
CmdC struct {
FileC string `type:"existingfile" default:"testdata/ccc-missing.txt"`
} `cmd:""`
}
var cli CLI
file := "testdata/file.txt"
p := mustNew(t, &cli)
_, err := p.Parse([]string{"cmd-a", "--file-a", file, "--file-b", file})
assert.NoError(t, err)
assert.NotZero(t, cli.CmdA.FileA)
assert.Contains(t, cli.CmdA.FileA, file)
assert.NotZero(t, cli.CmdA.FileB)
assert.Contains(t, cli.CmdA.FileB, file)
p = mustNew(t, &cli)
_, err = p.Parse([]string{"cmd-a", "--file-a", file})
assert.Error(t, err)
assert.Contains(t, err.Error(), "bbb-missing.txt: no such file or directory")
}
//nolint:dupl
@@ -486,6 +515,35 @@ func TestExistingDirMapperDefaultMissing(t *testing.T) {
assert.NoError(t, err)
assert.NotZero(t, cli.Dir)
assert.Contains(t, cli.Dir, dir)
p = mustNew(t, &cli)
_, err = p.Parse([]string{})
assert.Error(t, err)
assert.Contains(t, err.Error(), "missing-dir: no such file or directory")
}
func TestExistingDirMapperDefaultMissingCmds(t *testing.T) {
type CLI struct {
CmdA struct {
DirA string `type:"existingdir" default:"aaa-missing-dir"`
DirB string `type:"existingdir" default:"bbb-missing-dir"`
} `cmd:""`
CmdC struct {
DirC string `type:"existingdir" default:"ccc-missing-dir"`
} `cmd:""`
}
var cli CLI
dir := "testdata"
p := mustNew(t, &cli)
_, err := p.Parse([]string{"cmd-a", "--dir-a", dir, "--dir-b", dir})
assert.NoError(t, err)
assert.NotZero(t, cli.CmdA.DirA)
assert.NotZero(t, cli.CmdA.DirB)
assert.Contains(t, cli.CmdA.DirA, dir)
assert.Contains(t, cli.CmdA.DirB, dir)
p = mustNew(t, &cli)
_, err = p.Parse([]string{"cmd-a", "--dir-a", dir})
assert.Error(t, err)
assert.Contains(t, err.Error(), "bbb-missing-dir: no such file or directory")
}
func TestMapperPlaceHolder(t *testing.T) {
+3
View File
@@ -54,6 +54,7 @@ type Node struct {
Tag *Tag
Aliases []string
Passthrough bool // Set to true to stop flag parsing when encountered.
Active bool // Denotes the node is part of an active branch in the CLI.
Argument *Value // Populated when Type is ArgumentNode.
}
@@ -98,6 +99,7 @@ func (n *Node) AllFlags(hide bool) (out [][]*Flag) {
group := []*Flag{}
for _, flag := range n.Flags {
if !hide || !flag.Hidden {
flag.Active = true
group = append(group, flag)
}
}
@@ -243,6 +245,7 @@ type Value struct {
Format string // Formatting directive, if applicable.
Position int // Position (for positional arguments).
Passthrough bool // Set to true to stop flag parsing when encountered.
Active bool // Denotes the value is part of an active branch in the CLI.
}
// EnumMap returns a map of the enums in this value.