func (m *Manager) handleFlags(command Command, name string, args []string) (Command, []string, error) { var flagset *gnuflag.FlagSet if flagged, ok := command.(FlaggedCommand); ok { flagset = flagged.Flags() } else { flagset = gnuflag.NewFlagSet(name, gnuflag.ExitOnError) } var helpRequested bool flagset.SetOutput(m.stderr) if flagset.Lookup("help") == nil { flagset.BoolVar(&helpRequested, "help", false, "Display help and exit") } if flagset.Lookup("h") == nil { flagset.BoolVar(&helpRequested, "h", false, "Display help and exit") } err := flagset.Parse(true, args) if err != nil { return nil, nil, err } if helpRequested { command = m.Commands["help"] args = []string{name} } else { args = flagset.Args() } return command, args, nil }
// Help renders i's content, along with documentation for any // flags defined in f. It calls f.SetOutput(ioutil.Discard). func (i *Info) Help(f *gnuflag.FlagSet) []byte { buf := &bytes.Buffer{} fmt.Fprintf(buf, "usage: %s", i.Name) hasOptions := false f.VisitAll(func(f *gnuflag.Flag) { hasOptions = true }) if hasOptions { fmt.Fprintf(buf, " [options]") } if i.Args != "" { fmt.Fprintf(buf, " %s", i.Args) } fmt.Fprintf(buf, "\n") if i.Purpose != "" { fmt.Fprintf(buf, "purpose: %s\n", i.Purpose) } if hasOptions { fmt.Fprintf(buf, "\noptions:\n") f.SetOutput(buf) f.PrintDefaults() } f.SetOutput(ioutil.Discard) if i.Doc != "" { fmt.Fprintf(buf, "\n%s\n", strings.TrimSpace(i.Doc)) } if len(i.Aliases) > 0 { fmt.Fprintf(buf, "\naliases: %s\n", strings.Join(i.Aliases, ", ")) } return buf.Bytes() }