From 1bfac8f0cd77d2a18baf33d904b3ea0e6ea821f5 Mon Sep 17 00:00:00 2001 From: Eric Paris Date: Thu, 7 May 2015 16:44:02 -0400 Subject: parseLongArg code rework for readability move the -- parsing up into the parent make it more obvious which values we are using --- flag.go | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/flag.go b/flag.go index 55594df..4b96126 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,24 +517,23 @@ 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 - return - } + value = split[1] } - return args, nil + err = f.setFlag(flag, value, s) + return } func (f *FlagSet) parseShortArg(s string, args []string) (a []string, err error) { @@ -605,12 +600,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) } -- cgit v1.2.3 From ea5408381a3a773ae7f9b671e19e72eadf76af31 Mon Sep 17 00:00:00 2001 From: Eric Paris Date: Fri, 8 May 2015 11:39:59 -0400 Subject: Rewrite short arg parsing for readability new function to parse each arg (less indentation) make it clear what value is being set and where it came from --- flag.go | 74 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/flag.go b/flag.go index 4b96126..23ef501 100644 --- a/flag.go +++ b/flag.go @@ -536,50 +536,48 @@ func (f *FlagSet) parseLongArg(s string, args []string) (a []string, err error) 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 + } + 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 -- cgit v1.2.3