diff options
| author | Bjørn Erik Pedersen <[email protected]> | 2015-05-08 19:22:45 +0200 |
|---|---|---|
| committer | Bjørn Erik Pedersen <[email protected]> | 2015-05-08 19:22:45 +0200 |
| commit | 0d4b3d7112e1cd81953793e92031e43dc5a52190 (patch) | |
| tree | 5fab6c78a0ef92702f632c3eca63a712592bc70a /flag.go | |
| parent | 8730624c6c03fa1c5b8ae471cb5e4d735784d32a (diff) | |
| parent | ea5408381a3a773ae7f9b671e19e72eadf76af31 (diff) | |
Merge pull request #19 from eparis/parse-rework
Parse rework
Diffstat (limited to 'flag.go')
| -rw-r--r-- | flag.go | 94 |
1 files changed, 43 insertions, 51 deletions
@@ -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) } |
