@@ -1,6 +1,7 @@
|
|||||||
package kong
|
package kong
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -130,9 +131,12 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag {
|
|||||||
t.Ignored = true
|
t.Ignored = true
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
t := &Tag{
|
var (
|
||||||
|
err error
|
||||||
|
t = &Tag{
|
||||||
items: parseTagItems(getTagInfo(ft)),
|
items: parseTagItems(getTagInfo(ft)),
|
||||||
}
|
}
|
||||||
|
)
|
||||||
t.Cmd = t.Has("cmd")
|
t.Cmd = t.Has("cmd")
|
||||||
t.Arg = t.Has("arg")
|
t.Arg = t.Has("arg")
|
||||||
required := t.Has("required")
|
required := t.Has("required")
|
||||||
@@ -151,7 +155,10 @@ func parseTag(fv reflect.Value, ft reflect.StructField) *Tag {
|
|||||||
t.Help = t.Get("help")
|
t.Help = t.Get("help")
|
||||||
t.Type = t.Get("type")
|
t.Type = t.Get("type")
|
||||||
t.Env = t.Get("env")
|
t.Env = t.Get("env")
|
||||||
t.Short, _ = t.GetRune("short")
|
t.Short, err = t.GetRune("short")
|
||||||
|
if err != nil && t.Get("short") != "" {
|
||||||
|
fail("invalid short flag name %q: %s", t.Get("short"), err)
|
||||||
|
}
|
||||||
t.Hidden = t.Has("hidden")
|
t.Hidden = t.Has("hidden")
|
||||||
t.Format = t.Get("format")
|
t.Format = t.Get("format")
|
||||||
t.Sep, _ = t.GetSep("sep", ',')
|
t.Sep, _ = t.GetSep("sep", ',')
|
||||||
@@ -232,9 +239,10 @@ func (t *Tag) GetInt(k string) (int64, error) {
|
|||||||
|
|
||||||
// GetRune parses the given tag as a rune.
|
// GetRune parses the given tag as a rune.
|
||||||
func (t *Tag) GetRune(k string) (rune, error) {
|
func (t *Tag) GetRune(k string) (rune, error) {
|
||||||
r, _ := utf8.DecodeRuneInString(t.Get(k))
|
value := t.Get(k)
|
||||||
if r == utf8.RuneError {
|
r, size := utf8.DecodeRuneInString(value)
|
||||||
return 0, fmt.Errorf("%v has a rune error", t.Get(k))
|
if r == utf8.RuneError || size < len(value) {
|
||||||
|
return 0, errors.New("invalid rune")
|
||||||
}
|
}
|
||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,3 +192,11 @@ func TestTagAliasesSub(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, "arg", cli.Cmd.SubCmd.Arg)
|
require.Equal(t, "arg", cli.Cmd.SubCmd.Arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInvalidRuneErrors(t *testing.T) {
|
||||||
|
cli := struct {
|
||||||
|
Flag bool `short:"invalid"`
|
||||||
|
}{}
|
||||||
|
_, err := kong.New(&cli)
|
||||||
|
require.EqualError(t, err, "invalid short flag name \"invalid\": invalid rune")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user