Factor out duplicate value reset code.
This commit is contained in:
@@ -5,7 +5,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
)
|
)
|
||||||
@@ -75,23 +74,15 @@ func (k *Kong) Parse(args []string) (command string, err error) {
|
|||||||
// Recursively reset values to defaults (as specified in the grammar) or the zero value.
|
// Recursively reset values to defaults (as specified in the grammar) or the zero value.
|
||||||
func (k *Kong) reset(node *Node) {
|
func (k *Kong) reset(node *Node) {
|
||||||
for _, flag := range node.Flags {
|
for _, flag := range node.Flags {
|
||||||
flag.Value.Value.Set(reflect.Zero(flag.Value.Value.Type()))
|
flag.Value.Reset()
|
||||||
if flag.Default != "" {
|
|
||||||
flag.Decode(Scan(flag.Default))
|
|
||||||
flag.Set = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for _, pos := range node.Positional {
|
for _, pos := range node.Positional {
|
||||||
pos.Value.Set(reflect.Zero(pos.Value.Type()))
|
pos.Reset()
|
||||||
if pos.Default != "" {
|
|
||||||
pos.Decode(Scan(pos.Default))
|
|
||||||
pos.Set = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for _, branch := range node.Children {
|
for _, branch := range node.Children {
|
||||||
if branch.Argument != nil {
|
if branch.Argument != nil {
|
||||||
arg := branch.Argument.Argument
|
arg := branch.Argument.Argument
|
||||||
arg.Value.Set(reflect.Zero(arg.Value.Type()))
|
arg.Reset()
|
||||||
k.reset(&branch.Argument.Node)
|
k.reset(&branch.Argument.Node)
|
||||||
} else {
|
} else {
|
||||||
k.reset(branch.Command)
|
k.reset(branch.Command)
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ func (v *Value) Decode(scan *Scanner) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (v *Value) Reset() {
|
||||||
|
v.Value.Set(reflect.Zero(v.Value.Type()))
|
||||||
|
if v.Default != "" {
|
||||||
|
v.Decode(Scan(v.Default))
|
||||||
|
v.Set = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type Positional = Value
|
type Positional = Value
|
||||||
|
|
||||||
type Argument struct {
|
type Argument struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user