usage.go 887 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package main
  2. import (
  3. "bytes"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "text/tabwriter"
  8. )
  9. func optionTable(w io.Writer, rows [][]string) {
  10. tw := tabwriter.NewWriter(w, 2, 4, 2, ' ', 0)
  11. for _, row := range rows {
  12. for i, cell := range row {
  13. if i > 0 {
  14. tw.Write([]byte("\t"))
  15. }
  16. tw.Write([]byte(cell))
  17. }
  18. tw.Write([]byte("\n"))
  19. }
  20. tw.Flush()
  21. }
  22. func usageFor(fs *flag.FlagSet, usage string) func() {
  23. return func() {
  24. var b bytes.Buffer
  25. b.WriteString("Usage:\n " + usage + "\n")
  26. var options [][]string
  27. fs.VisitAll(func(f *flag.Flag) {
  28. var dash = "-"
  29. if len(f.Name) > 1 {
  30. dash = "--"
  31. }
  32. var opt = " " + dash + f.Name
  33. if f.DefValue != "false" {
  34. opt += "=" + f.DefValue
  35. }
  36. options = append(options, []string{opt, f.Usage})
  37. })
  38. if len(options) > 0 {
  39. b.WriteString("\nOptions:\n")
  40. optionTable(&b, options)
  41. }
  42. fmt.Println(b.String())
  43. }
  44. }