"flag"
"fmt"
"io"
+ "reflect"
)
+// Hack to enable checking whether a given FlagSet's Usage method is
+// the (private) default one.
+var defaultFlagSet = flag.NewFlagSet("none", flag.ContinueOnError)
+
// ParseFlags calls f.Parse(args) and prints appropriate error/help
// messages to stderr.
//
case nil:
if f.NArg() > 0 && positional == "" {
fmt.Fprintf(stderr, "unrecognized command line arguments: %v (try -help)\n", f.Args())
- return false, 2
+ return false, EXIT_INVALIDARGUMENT
}
return true, 0
case flag.ErrHelp:
- if f, ok := f.(*flag.FlagSet); ok && f.Usage != nil {
+ // Use our own default usage func, not the one
+ // provided by the flag pkg, if the caller hasn't set
+ // one. (We use reflect to determine whether f.Usage
+ // is the private defaultUsage func that
+ // flag.NewFlagSet uses.)
+ if f, ok := f.(*flag.FlagSet); ok && f.Usage != nil && reflect.ValueOf(f.Usage).String() != reflect.ValueOf(defaultFlagSet.Usage).String() {
f.SetOutput(stderr)
f.Usage()
} else {
return false, 0
default:
fmt.Fprintf(stderr, "error parsing command line arguments: %s (try -help)\n", err)
- return false, 2
+ return false, EXIT_INVALIDARGUMENT
}
}