flagsets.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package flagsets
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/spf13/pflag"
  6. "io"
  7. "strings"
  8. )
  9. // NamedFlagSets 自定义的选项集合
  10. type NamedFlagSets struct {
  11. Order []string
  12. FlagSets map[string]*pflag.FlagSet
  13. }
  14. func (nfs *NamedFlagSets) FlagSet(name string) *pflag.FlagSet {
  15. if nfs.FlagSets == nil {
  16. nfs.FlagSets = make(map[string]*pflag.FlagSet)
  17. }
  18. if nfs.Order == nil {
  19. nfs.Order = make([]string, 0)
  20. }
  21. if _, ok := nfs.FlagSets[name]; !ok {
  22. nfs.FlagSets[name] = pflag.NewFlagSet(name, pflag.ExitOnError)
  23. nfs.Order = append(nfs.Order, name)
  24. }
  25. return nfs.FlagSets[name]
  26. }
  27. func PrintSections(w io.Writer, fss NamedFlagSets, cols int) {
  28. for _, name := range fss.Order {
  29. fs := fss.FlagSets[name]
  30. if !fs.HasFlags() {
  31. continue
  32. }
  33. wideFS := pflag.NewFlagSet("", pflag.ExitOnError)
  34. wideFS.AddFlagSet(fs)
  35. var zzz string
  36. if cols > 24 {
  37. zzz = strings.Repeat("z", cols-24)
  38. wideFS.Int(zzz, 0, strings.Repeat("z", cols-24))
  39. }
  40. var buf bytes.Buffer
  41. fmt.Fprintf(&buf, "\n%s flags:\n\n%s", strings.ToUpper(name[:1])+name[1:], wideFS.FlagUsagesWrapped(cols))
  42. if cols > 24 {
  43. i := strings.Index(buf.String(), zzz)
  44. lines := strings.Split(buf.String()[:i], "\n")
  45. fmt.Fprint(w, strings.Join(lines[:len(lines)-1], "\n"))
  46. fmt.Fprintln(w)
  47. } else {
  48. fmt.Fprint(w, buf.String())
  49. }
  50. }
  51. }