aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2015-05-08 19:22:45 +0200
committerBjørn Erik Pedersen <[email protected]>2015-05-08 19:22:45 +0200
commit0d4b3d7112e1cd81953793e92031e43dc5a52190 (patch)
tree5fab6c78a0ef92702f632c3eca63a712592bc70a
parent8730624c6c03fa1c5b8ae471cb5e4d735784d32a (diff)
parentea5408381a3a773ae7f9b671e19e72eadf76af31 (diff)
Merge pull request #19 from eparis/parse-rework
Parse rework
-rw-r--r--flag.go94
1 files changed, 43 insertions, 51 deletions
diff --git a/flag.go b/flag.go
index 55594df..23ef501 100644
--- a/flag.go
+++ b/flag.go
@@ -505,10 +505,6 @@ func (f *FlagSet) setFlag(flag *Flag, value string, origArg string) error {
func (f *FlagSet) parseLongArg(s string, args []string) (a []string, err error) {
a = args
- if len(s) == 2 { // "--" terminates the flags
- f.args = append(f.args, args...)
- return
- }
name := s[2:]
if len(name) == 0 || name[0] == '-' || name[0] == '=' {
err = f.failf("bad flag syntax: %s", s)
@@ -521,70 +517,67 @@ func (f *FlagSet) parseLongArg(s string, args []string) (a []string, err error)
if !alreadythere {
if name == "help" { // special case for nice help message.
f.usage()
- return args, ErrHelp
+ return a, ErrHelp
}
err = f.failf("unknown flag: --%s", name)
return
}
+ var value string
if len(split) == 1 {
if bv, ok := flag.Value.(boolFlag); !ok || !bv.IsBoolFlag() {
err = f.failf("flag needs an argument: %s", s)
return
}
- f.setFlag(flag, "true", s)
+ value = "true"
} else {
- if e := f.setFlag(flag, split[1], s); e != nil {
- err = e
+ value = split[1]
+ }
+ err = f.setFlag(flag, value, s)
+ return
+}
+
+func (f *FlagSet) parseSingleShortArg(shorthands string, args []string) (outShorts string, outArgs []string, err error) {
+ outArgs = args
+ outShorts = shorthands[1:]
+ c := shorthands[0]
+
+ flag, alreadythere := f.shorthands[c]
+ if !alreadythere {
+ if c == 'h' { // special case for nice help message.
+ f.usage()
+ err = ErrHelp
return
}
+ //TODO continue on error
+ err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
+ return
}
- return args, nil
+ var value string
+ if bv, ok := flag.Value.(boolFlag); ok && bv.IsBoolFlag() {
+ value = "true"
+ } else if len(shorthands) > 1 {
+ value = strings.TrimPrefix(shorthands[1:], "=")
+ outShorts = ""
+ } else if len(args) > 0 {
+ value = args[0]
+ outArgs = args[1:]
+ } else {
+ err = f.failf("flag needs an argument: %q in -%s", c, shorthands)
+ return
+ }
+ err = f.setFlag(flag, value, shorthands)
+ return
}
func (f *FlagSet) parseShortArg(s string, args []string) (a []string, err error) {
a = args
shorthands := s[1:]
- for i := 0; i < len(shorthands); i++ {
- c := shorthands[i]
- flag, alreadythere := f.shorthands[c]
- if !alreadythere {
- if c == 'h' { // special case for nice help message.
- f.usage()
- err = ErrHelp
- return
- }
- //TODO continue on error
- err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
- if len(args) == 0 {
- return
- }
+ for len(shorthands) > 0 {
+ shorthands, a, err = f.parseSingleShortArg(shorthands, args)
+ if err != nil {
return
}
- if alreadythere {
- if bv, ok := flag.Value.(boolFlag); ok && bv.IsBoolFlag() {
- f.setFlag(flag, "true", s)
- continue
- }
- if i < len(shorthands)-1 {
- v := strings.TrimPrefix(shorthands[i+1:], "=")
- if e := f.setFlag(flag, v, s); e != nil {
- err = e
- return
- }
- break
- }
- if len(args) == 0 {
- err = f.failf("flag needs an argument: %q in -%s", c, shorthands)
- return
- }
- if e := f.setFlag(flag, args[0], s); e != nil {
- err = e
- return
- }
- }
- a = args[1:]
- break // should be unnecessary
}
return
@@ -605,12 +598,11 @@ func (f *FlagSet) parseArgs(args []string) (err error) {
}
if s[1] == '-' {
- args, err = f.parseLongArg(s, args)
-
- if len(s) == 2 {
- // stop parsing after --
+ if len(s) == 2 { // "--" terminates the flags
+ f.args = append(f.args, args...)
break
}
+ args, err = f.parseLongArg(s, args)
} else {
args, err = f.parseShortArg(s, args)
}