Tracing parser (#11)

* Add tracing to the parser.

* Synthesize a --help flag.

* Parsing now occurs in multiple phases.

1. Reset target.
2. Parse command-line into a "trace" (no values are written to target).
3. Apply traced, parsed values to the target fields.

This is another step in facilitating context-sensitive help and
completion.

* Detect duplicate flags.
This commit is contained in:
Alec Thomas
2018-05-22 00:07:43 -04:00
committed by Gerald Kaszuba
parent 3eb5e285ed
commit ab5cf7e6ef
8 changed files with 247 additions and 77 deletions
+46 -1
View File
@@ -8,7 +8,9 @@ import (
func mustNew(t *testing.T, cli interface{}) *Kong {
t.Helper()
parser, err := New(cli)
parser, err := New(cli, ExitFunction(func(int) {
t.Fatalf("unexpected exit()")
}))
require.NoError(t, err)
return parser
}
@@ -307,3 +309,46 @@ func TestEscapedQuote(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "i don't know", cli.DoYouKnow)
}
func TestInvalidDefaultErrors(t *testing.T) {
var cli struct {
Flag int `kong:"default='foo'"`
}
p := mustNew(t, &cli)
_, err := p.Parse(nil)
require.Error(t, err)
}
func TestHelp(t *testing.T) {
var cli struct {
Flag string
}
p := mustNew(t, &cli)
_, err := p.Parse([]string{"--flag=hello", "--help"})
require.NoError(t, err)
require.NotEqual(t, "hello", cli.Flag)
}
func TestDuplicateFlag(t *testing.T) {
var cli struct {
Flag bool
Cmd struct {
Flag bool
}
}
_, err := New(&cli)
require.Error(t, err)
}
func TestDuplicateFlagOnPeerCommandIsOkay(t *testing.T) {
var cli struct {
Cmd1 struct {
Flag bool
}
Cmd2 struct {
Flag bool
}
}
_, err := New(&cli)
require.NoError(t, err)
}