Extend Tag for non-core decoders (Fixes #14)
This commit is contained in:
committed by
Alec Thomas
parent
6c80dd3f31
commit
886edb6f5a
+2
-2
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
func TestParseHandlingBadBuild(t *testing.T) {
|
func TestParseHandlingBadBuild(t *testing.T) {
|
||||||
var cli struct {
|
var cli struct {
|
||||||
Enabled bool `kong:"unknown"`
|
Enabled bool `kong:"fail='"`
|
||||||
}
|
}
|
||||||
|
|
||||||
args := os.Args
|
args := os.Args
|
||||||
@@ -21,7 +21,7 @@ func TestParseHandlingBadBuild(t *testing.T) {
|
|||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
require.Equal(t, Error{msg: "unknown is an unknown kong key"}, r)
|
require.Equal(t, Error{msg: "fail=' is not quoted properly"}, r)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|||||||
@@ -276,14 +276,6 @@ func TestCommaInQuotes(t *testing.T) {
|
|||||||
require.Equal(t, "1,2", cli.Numbers)
|
require.Equal(t, "1,2", cli.Numbers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnknownKey(t *testing.T) {
|
|
||||||
var cli struct {
|
|
||||||
Numbers string `kong:"gak='hi'"`
|
|
||||||
}
|
|
||||||
_, err := New(&cli)
|
|
||||||
require.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBadString(t *testing.T) {
|
func TestBadString(t *testing.T) {
|
||||||
var cli struct {
|
var cli struct {
|
||||||
Numbers string `kong:"default='yay'n"`
|
Numbers string `kong:"default='yay'n"`
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package kong
|
package kong
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
@@ -18,6 +20,9 @@ type Tag struct {
|
|||||||
Placeholder string
|
Placeholder string
|
||||||
Env string
|
Env string
|
||||||
Short rune
|
Short rune
|
||||||
|
|
||||||
|
// Storage for all tag keys for arbitrary lookups.
|
||||||
|
items map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseCSV(s string) map[string]string {
|
func parseCSV(s string) map[string]string {
|
||||||
@@ -86,44 +91,58 @@ func parseCSV(s string) map[string]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseTag(fv reflect.Value, s string) *Tag {
|
func parseTag(fv reflect.Value, s string) *Tag {
|
||||||
t := &Tag{}
|
t := &Tag{
|
||||||
|
items: map[string]string{},
|
||||||
|
}
|
||||||
if s == "" {
|
if s == "" {
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
for k, v := range parseCSV(s) {
|
t.items = parseCSV(s)
|
||||||
switch k {
|
|
||||||
case "cmd":
|
|
||||||
t.Cmd = true
|
|
||||||
case "arg":
|
|
||||||
t.Arg = true
|
|
||||||
case "required":
|
|
||||||
t.Required = true
|
|
||||||
case "optional":
|
|
||||||
t.Optional = true
|
|
||||||
case "default":
|
|
||||||
t.Default = v
|
|
||||||
case "help":
|
|
||||||
t.Help = v
|
|
||||||
case "type":
|
|
||||||
t.Type = v
|
|
||||||
case "placeholder":
|
|
||||||
t.Placeholder = v
|
|
||||||
case "env":
|
|
||||||
t.Env = v
|
|
||||||
case "rune":
|
|
||||||
t.Short, _ = utf8.DecodeRuneInString(v)
|
|
||||||
if t.Short == utf8.RuneError {
|
|
||||||
t.Short = 0
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fail("%v is an unknown kong key", k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
t.Cmd = t.Has("cmd")
|
||||||
|
t.Arg = t.Has("arg")
|
||||||
|
t.Required = t.Has("required")
|
||||||
|
t.Optional = t.Has("optional")
|
||||||
|
t.Default, _ = t.Get("default")
|
||||||
|
t.Help, _ = t.Get("help")
|
||||||
|
t.Type, _ = t.Get("type")
|
||||||
|
t.Env, _ = t.Get("env")
|
||||||
|
t.Short, _ = t.GetRune("short")
|
||||||
|
|
||||||
|
t.Placeholder, _ = t.Get("placeholder")
|
||||||
if t.Placeholder == "" {
|
if t.Placeholder == "" {
|
||||||
t.Placeholder = strings.ToUpper(dashedString(fv.Type().Name()))
|
t.Placeholder = strings.ToUpper(dashedString(fv.Type().Name()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Tag) Has(k string) bool {
|
||||||
|
_, ok := t.items[k]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tag) Get(k string) (string, error) {
|
||||||
|
return t.items[k], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tag) GetBool(k string) (bool, error) {
|
||||||
|
return strconv.ParseBool(t.items[k])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tag) GetFloat(k string) (float64, error) {
|
||||||
|
return strconv.ParseFloat(t.items[k], 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tag) GetInt(k string) (int64, error) {
|
||||||
|
return strconv.ParseInt(t.items[k], 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tag) GetRune(k string) (rune, error) {
|
||||||
|
r, _ := utf8.DecodeRuneInString(t.items[k])
|
||||||
|
if r == utf8.RuneError {
|
||||||
|
return 0, fmt.Errorf("%v has a rune error", t.items[k])
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user