Parse env-only vars
This commit is contained in:
parent
ccf62e0ffc
commit
b928a1839a
29
parse.go
29
parse.go
|
@ -54,6 +54,7 @@ type spec struct {
|
|||
separate bool // if true, each slice and map entry will have its own --flag
|
||||
help string // the help text for this option
|
||||
env string // the name of the environment variable for this option, or empty for none
|
||||
envOnly bool
|
||||
defaultValue reflect.Value // default value for this option
|
||||
defaultString string // default value for this option, in string form to be displayed in help text
|
||||
placeholder string // name of the data in help
|
||||
|
@ -343,7 +344,9 @@ func cmdFromStruct(name string, dest path, t reflect.Type) (*command, error) {
|
|||
|
||||
// Look at the tag
|
||||
var isSubcommand bool // tracks whether this field is a subcommand
|
||||
for _, key := range strings.Split(tag, ",") {
|
||||
kvPairs := strings.Split(tag, ",")
|
||||
|
||||
for _, key := range kvPairs {
|
||||
if key == "" {
|
||||
continue
|
||||
}
|
||||
|
@ -360,7 +363,7 @@ func cmdFromStruct(name string, dest path, t reflect.Type) (*command, error) {
|
|||
case strings.HasPrefix(key, "--"):
|
||||
spec.long = key[2:]
|
||||
case strings.HasPrefix(key, "-"):
|
||||
if len(key) != 2 {
|
||||
if len(key) > 2 {
|
||||
errs = append(errs, fmt.Sprintf("%s.%s: short arguments must be one character only",
|
||||
t.Name(), field.Name))
|
||||
return false
|
||||
|
@ -415,6 +418,12 @@ func cmdFromStruct(name string, dest path, t reflect.Type) (*command, error) {
|
|||
spec.placeholder = strings.ToUpper(spec.field.Name)
|
||||
}
|
||||
|
||||
if spec.env == "" && emptyLongAndShort(kvPairs) {
|
||||
errs = append(errs, fmt.Sprintf("%s.%s: short arguments must be one character only",
|
||||
t.Name(), field.Name))
|
||||
return false
|
||||
}
|
||||
|
||||
// if this is a subcommand then we've done everything we need to do
|
||||
if isSubcommand {
|
||||
return false
|
||||
|
@ -788,6 +797,22 @@ func isFlag(s string) bool {
|
|||
return strings.HasPrefix(s, "-") && strings.TrimLeft(s, "-") != ""
|
||||
}
|
||||
|
||||
func emptyLongAndShort(kv []string) bool {
|
||||
var noShort, noLong bool
|
||||
for _, key := range kv {
|
||||
if key == "-" {
|
||||
noShort = true
|
||||
}
|
||||
|
||||
if key == "--" {
|
||||
noLong = true
|
||||
}
|
||||
}
|
||||
|
||||
return noShort && noLong
|
||||
|
||||
}
|
||||
|
||||
// val returns a reflect.Value corresponding to the current value for the
|
||||
// given path
|
||||
func (p *Parser) val(dest path) reflect.Value {
|
||||
|
|
|
@ -544,10 +544,10 @@ Options:
|
|||
}
|
||||
|
||||
func TestUsageWithEnvOptions(t *testing.T) {
|
||||
expectedUsage := "Usage: [CUSTOM=custom_value] [ENVONLY=envonly_value] example [-s SHORT]"
|
||||
expectedUsage := "Usage: example [-s SHORT]"
|
||||
|
||||
expectedHelp := `
|
||||
Usage: [CUSTOM=custom_value] [ENVONLY=envonly_value] example [-s SHORT]
|
||||
Usage: example [-s SHORT]
|
||||
|
||||
Options:
|
||||
-s SHORT [env: SHORT]
|
||||
|
@ -652,10 +652,10 @@ Options:
|
|||
}
|
||||
|
||||
func TestFailEnvOnly(t *testing.T) {
|
||||
expectedUsage := "Usage: [AUTH_KEY=auth_key_value] example [--arg ARG]"
|
||||
expectedUsage := "Usage: example [--arg ARG]"
|
||||
|
||||
expectedHelp := `
|
||||
Usage: [AUTH_KEY=auth_key_value] example [--arg ARG]
|
||||
Usage: example [--arg ARG]
|
||||
|
||||
Options:
|
||||
--arg ARG, -a ARG [env: MY_ARG]
|
||||
|
|
Loading…
Reference in New Issue