Guest User

Untitled

a guest
Nov 21st, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. // reorderArgs returns a copy of a slice of command-line
  2. // arguments, rearranged so that flags appear before non-
  3. // flag arguments (as required by Go's flag parsing code).
  4. // The provided flagset should contain all valid flags.
  5. func reorderArgs(args []string, fs *flag.FlagSet) []string {
  6.  
  7. nArgs := len(args)
  8.  
  9. if nArgs < 2 {
  10. return args
  11. }
  12.  
  13. // Define slices to hold flag and non-flag
  14. // arguments.
  15. flags := make([]string, 0, nArgs)
  16. nonFlags := make([]string, 0, nArgs)
  17.  
  18. // Loop over the arguments adding each one to
  19. // the relevant slice.
  20. for i := 0; i < nArgs; i++ {
  21.  
  22. arg := args[i]
  23.  
  24. // A double dash signifies the end of the flag
  25. // arguments. This and all remaining arguments
  26. // are non-flags.
  27. if arg == "--" {
  28. nonFlags = append(nonFlags, args[i:]...)
  29. break
  30. }
  31.  
  32. // Arguments with fewer than two characters or
  33. // a non-dash first letter are non-flags.
  34. if len(arg) < 2 || arg[0] != '-' {
  35. nonFlags = append(nonFlags, arg)
  36. continue
  37. }
  38.  
  39. // We have what looks like a flag. Get its name,
  40. // remembering to handle single and double dashes.
  41. name := arg[1:]
  42. if name[0] == '-' {
  43. name = name[1:]
  44. }
  45.  
  46. // Go supports 3 flag styles:
  47. // -name=value
  48. // -name value (non-boolean only)
  49. // -name (boolean only)
  50. //
  51. // If the name contains an equals sign, assume
  52. // a -name=value style flag.
  53. hasValue := false
  54. for j, n := 0, len(name); j < n; j++ {
  55. if name[j] == '=' {
  56. hasValue = true
  57. break
  58. }
  59. }
  60.  
  61. // Handle -name=value style flags.
  62. if hasValue {
  63. flags = append(flags, arg)
  64. continue
  65. }
  66.  
  67. // Handle -name style (i.e. boolean) flags.
  68. if isBoolFlag(name, fs) {
  69. flags = append(flags, arg)
  70. continue
  71. }
  72.  
  73. // Assume anything else is a -name value style
  74. // flag.
  75. flags = append(flags, arg)
  76. if i < nArgs-1 {
  77. i++
  78. flags = append(flags, args[i])
  79. }
  80. }
  81.  
  82. return append(flags, nonFlags...)
  83. }
  84.  
  85. type boolFlag interface {
  86. IsBoolFlag() bool
  87. }
  88.  
  89. func isBoolFlag(name string, fs *flag.FlagSet) bool {
  90.  
  91. f := fs.Lookup(name)
  92. if f == nil {
  93. return false
  94. }
  95.  
  96. b, ok := f.Value.(boolFlag)
  97. if !ok {
  98. return false
  99. }
  100.  
  101. return b.IsBoolFlag()
  102. }
Add Comment
Please, Sign In to add comment