1
2
3
4
5
99 package pflag
100
101 import (
102 "bytes"
103 "errors"
104 goflag "flag"
105 "fmt"
106 "io"
107 "os"
108 "sort"
109 "strings"
110 )
111
112
113 var ErrHelp = errors.New("pflag: help requested")
114
115
116 type ErrorHandling int
117
118 const (
119
120 ContinueOnError ErrorHandling = iota
121
122 ExitOnError
123
124 PanicOnError
125 )
126
127
128 type ParseErrorsWhitelist struct {
129
130 UnknownFlags bool
131 }
132
133
134
135 type NormalizedName string
136
137
138 type FlagSet struct {
139
140
141
142 Usage func()
143
144
145
146 SortFlags bool
147
148
149 ParseErrorsWhitelist ParseErrorsWhitelist
150
151 name string
152 parsed bool
153 actual map[NormalizedName]*Flag
154 orderedActual []*Flag
155 sortedActual []*Flag
156 formal map[NormalizedName]*Flag
157 orderedFormal []*Flag
158 sortedFormal []*Flag
159 shorthands map[byte]*Flag
160 args []string
161 argsLenAtDash int
162 errorHandling ErrorHandling
163 output io.Writer
164 interspersed bool
165 normalizeNameFunc func(f *FlagSet, name string) NormalizedName
166
167 addedGoFlagSets []*goflag.FlagSet
168 }
169
170
171 type Flag struct {
172 Name string
173 Shorthand string
174 Usage string
175 Value Value
176 DefValue string
177 Changed bool
178 NoOptDefVal string
179 Deprecated string
180 Hidden bool
181 ShorthandDeprecated string
182 Annotations map[string][]string
183 }
184
185
186
187 type Value interface {
188 String() string
189 Set(string) error
190 Type() string
191 }
192
193
194
195
196 type SliceValue interface {
197
198 Append(string) error
199
200 Replace([]string) error
201
202 GetSlice() []string
203 }
204
205
206 func sortFlags(flags map[NormalizedName]*Flag) []*Flag {
207 list := make(sort.StringSlice, len(flags))
208 i := 0
209 for k := range flags {
210 list[i] = string(k)
211 i++
212 }
213 list.Sort()
214 result := make([]*Flag, len(list))
215 for i, name := range list {
216 result[i] = flags[NormalizedName(name)]
217 }
218 return result
219 }
220
221
222
223
224
225
226 func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) {
227 f.normalizeNameFunc = n
228 f.sortedFormal = f.sortedFormal[:0]
229 for fname, flag := range f.formal {
230 nname := f.normalizeFlagName(flag.Name)
231 if fname == nname {
232 continue
233 }
234 flag.Name = string(nname)
235 delete(f.formal, fname)
236 f.formal[nname] = flag
237 if _, set := f.actual[fname]; set {
238 delete(f.actual, fname)
239 f.actual[nname] = flag
240 }
241 }
242 }
243
244
245
246 func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) NormalizedName {
247 if f.normalizeNameFunc != nil {
248 return f.normalizeNameFunc
249 }
250 return func(f *FlagSet, name string) NormalizedName { return NormalizedName(name) }
251 }
252
253 func (f *FlagSet) normalizeFlagName(name string) NormalizedName {
254 n := f.GetNormalizeFunc()
255 return n(f, name)
256 }
257
258 func (f *FlagSet) out() io.Writer {
259 if f.output == nil {
260 return os.Stderr
261 }
262 return f.output
263 }
264
265
266
267 func (f *FlagSet) SetOutput(output io.Writer) {
268 f.output = output
269 }
270
271
272
273
274 func (f *FlagSet) VisitAll(fn func(*Flag)) {
275 if len(f.formal) == 0 {
276 return
277 }
278
279 var flags []*Flag
280 if f.SortFlags {
281 if len(f.formal) != len(f.sortedFormal) {
282 f.sortedFormal = sortFlags(f.formal)
283 }
284 flags = f.sortedFormal
285 } else {
286 flags = f.orderedFormal
287 }
288
289 for _, flag := range flags {
290 fn(flag)
291 }
292 }
293
294
295 func (f *FlagSet) HasFlags() bool {
296 return len(f.formal) > 0
297 }
298
299
300
301 func (f *FlagSet) HasAvailableFlags() bool {
302 for _, flag := range f.formal {
303 if !flag.Hidden {
304 return true
305 }
306 }
307 return false
308 }
309
310
311
312
313 func VisitAll(fn func(*Flag)) {
314 CommandLine.VisitAll(fn)
315 }
316
317
318
319
320 func (f *FlagSet) Visit(fn func(*Flag)) {
321 if len(f.actual) == 0 {
322 return
323 }
324
325 var flags []*Flag
326 if f.SortFlags {
327 if len(f.actual) != len(f.sortedActual) {
328 f.sortedActual = sortFlags(f.actual)
329 }
330 flags = f.sortedActual
331 } else {
332 flags = f.orderedActual
333 }
334
335 for _, flag := range flags {
336 fn(flag)
337 }
338 }
339
340
341
342
343 func Visit(fn func(*Flag)) {
344 CommandLine.Visit(fn)
345 }
346
347
348 func (f *FlagSet) Lookup(name string) *Flag {
349 return f.lookup(f.normalizeFlagName(name))
350 }
351
352
353
354
355 func (f *FlagSet) ShorthandLookup(name string) *Flag {
356 if name == "" {
357 return nil
358 }
359 if len(name) > 1 {
360 msg := fmt.Sprintf("can not look up shorthand which is more than one ASCII character: %q", name)
361 fmt.Fprintf(f.out(), msg)
362 panic(msg)
363 }
364 c := name[0]
365 return f.shorthands[c]
366 }
367
368
369 func (f *FlagSet) lookup(name NormalizedName) *Flag {
370 return f.formal[name]
371 }
372
373
374 func (f *FlagSet) getFlagType(name string, ftype string, convFunc func(sval string) (interface{}, error)) (interface{}, error) {
375 flag := f.Lookup(name)
376 if flag == nil {
377 err := fmt.Errorf("flag accessed but not defined: %s", name)
378 return nil, err
379 }
380
381 if flag.Value.Type() != ftype {
382 err := fmt.Errorf("trying to get %s value of flag of type %s", ftype, flag.Value.Type())
383 return nil, err
384 }
385
386 sval := flag.Value.String()
387 result, err := convFunc(sval)
388 if err != nil {
389 return nil, err
390 }
391 return result, nil
392 }
393
394
395
396
397 func (f *FlagSet) ArgsLenAtDash() int {
398 return f.argsLenAtDash
399 }
400
401
402
403
404 func (f *FlagSet) MarkDeprecated(name string, usageMessage string) error {
405 flag := f.Lookup(name)
406 if flag == nil {
407 return fmt.Errorf("flag %q does not exist", name)
408 }
409 if usageMessage == "" {
410 return fmt.Errorf("deprecated message for flag %q must be set", name)
411 }
412 flag.Deprecated = usageMessage
413 flag.Hidden = true
414 return nil
415 }
416
417
418
419
420 func (f *FlagSet) MarkShorthandDeprecated(name string, usageMessage string) error {
421 flag := f.Lookup(name)
422 if flag == nil {
423 return fmt.Errorf("flag %q does not exist", name)
424 }
425 if usageMessage == "" {
426 return fmt.Errorf("deprecated message for flag %q must be set", name)
427 }
428 flag.ShorthandDeprecated = usageMessage
429 return nil
430 }
431
432
433
434 func (f *FlagSet) MarkHidden(name string) error {
435 flag := f.Lookup(name)
436 if flag == nil {
437 return fmt.Errorf("flag %q does not exist", name)
438 }
439 flag.Hidden = true
440 return nil
441 }
442
443
444
445 func Lookup(name string) *Flag {
446 return CommandLine.Lookup(name)
447 }
448
449
450
451 func ShorthandLookup(name string) *Flag {
452 return CommandLine.ShorthandLookup(name)
453 }
454
455
456 func (f *FlagSet) Set(name, value string) error {
457 normalName := f.normalizeFlagName(name)
458 flag, ok := f.formal[normalName]
459 if !ok {
460 return fmt.Errorf("no such flag -%v", name)
461 }
462
463 err := flag.Value.Set(value)
464 if err != nil {
465 var flagName string
466 if flag.Shorthand != "" && flag.ShorthandDeprecated == "" {
467 flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name)
468 } else {
469 flagName = fmt.Sprintf("--%s", flag.Name)
470 }
471 return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err)
472 }
473
474 if !flag.Changed {
475 if f.actual == nil {
476 f.actual = make(map[NormalizedName]*Flag)
477 }
478 f.actual[normalName] = flag
479 f.orderedActual = append(f.orderedActual, flag)
480
481 flag.Changed = true
482 }
483
484 if flag.Deprecated != "" {
485 fmt.Fprintf(f.out(), "Flag --%s has been deprecated, %s\n", flag.Name, flag.Deprecated)
486 }
487 return nil
488 }
489
490
491
492
493 func (f *FlagSet) SetAnnotation(name, key string, values []string) error {
494 normalName := f.normalizeFlagName(name)
495 flag, ok := f.formal[normalName]
496 if !ok {
497 return fmt.Errorf("no such flag -%v", name)
498 }
499 if flag.Annotations == nil {
500 flag.Annotations = map[string][]string{}
501 }
502 flag.Annotations[key] = values
503 return nil
504 }
505
506
507
508 func (f *FlagSet) Changed(name string) bool {
509 flag := f.Lookup(name)
510
511 if flag == nil {
512 return false
513 }
514 return flag.Changed
515 }
516
517
518 func Set(name, value string) error {
519 return CommandLine.Set(name, value)
520 }
521
522
523
524 func (f *FlagSet) PrintDefaults() {
525 usages := f.FlagUsages()
526 fmt.Fprint(f.out(), usages)
527 }
528
529
530
531 func (f *Flag) defaultIsZeroValue() bool {
532 switch f.Value.(type) {
533 case boolFlag:
534 return f.DefValue == "false"
535 case *durationValue:
536
537 return f.DefValue == "0" || f.DefValue == "0s"
538 case *intValue, *int8Value, *int32Value, *int64Value, *uintValue, *uint8Value, *uint16Value, *uint32Value, *uint64Value, *countValue, *float32Value, *float64Value:
539 return f.DefValue == "0"
540 case *stringValue:
541 return f.DefValue == ""
542 case *ipValue, *ipMaskValue, *ipNetValue:
543 return f.DefValue == "<nil>"
544 case *intSliceValue, *stringSliceValue, *stringArrayValue:
545 return f.DefValue == "[]"
546 default:
547 switch f.Value.String() {
548 case "false":
549 return true
550 case "<nil>":
551 return true
552 case "":
553 return true
554 case "0":
555 return true
556 }
557 return false
558 }
559 }
560
561
562
563
564
565
566 func UnquoteUsage(flag *Flag) (name string, usage string) {
567
568 usage = flag.Usage
569 for i := 0; i < len(usage); i++ {
570 if usage[i] == '`' {
571 for j := i + 1; j < len(usage); j++ {
572 if usage[j] == '`' {
573 name = usage[i+1 : j]
574 usage = usage[:i] + name + usage[j+1:]
575 return name, usage
576 }
577 }
578 break
579 }
580 }
581
582 name = flag.Value.Type()
583 switch name {
584 case "bool":
585 name = ""
586 case "float64":
587 name = "float"
588 case "int64":
589 name = "int"
590 case "uint64":
591 name = "uint"
592 case "stringSlice":
593 name = "strings"
594 case "intSlice":
595 name = "ints"
596 case "uintSlice":
597 name = "uints"
598 case "boolSlice":
599 name = "bools"
600 }
601
602 return
603 }
604
605
606
607
608
609 func wrapN(i, slop int, s string) (string, string) {
610 if i+slop > len(s) {
611 return s, ""
612 }
613
614 w := strings.LastIndexAny(s[:i], " \t\n")
615 if w <= 0 {
616 return s, ""
617 }
618 nlPos := strings.LastIndex(s[:i], "\n")
619 if nlPos > 0 && nlPos < w {
620 return s[:nlPos], s[nlPos+1:]
621 }
622 return s[:w], s[w+1:]
623 }
624
625
626
627
628 func wrap(i, w int, s string) string {
629 if w == 0 {
630 return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1)
631 }
632
633
634
635 wrap := w - i
636
637 var r, l string
638
639
640
641 if wrap < 24 {
642 i = 16
643 wrap = w - i
644 r += "\n" + strings.Repeat(" ", i)
645 }
646
647 if wrap < 24 {
648 return strings.Replace(s, "\n", r, -1)
649 }
650
651
652
653
654 slop := 5
655 wrap = wrap - slop
656
657
658
659 l, s = wrapN(wrap, slop, s)
660 r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1)
661
662
663 for s != "" {
664 var t string
665
666 t, s = wrapN(wrap, slop, s)
667 r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1)
668 }
669
670 return r
671
672 }
673
674
675
676
677 func (f *FlagSet) FlagUsagesWrapped(cols int) string {
678 buf := new(bytes.Buffer)
679
680 lines := make([]string, 0, len(f.formal))
681
682 maxlen := 0
683 f.VisitAll(func(flag *Flag) {
684 if flag.Hidden {
685 return
686 }
687
688 line := ""
689 if flag.Shorthand != "" && flag.ShorthandDeprecated == "" {
690 line = fmt.Sprintf(" -%s, --%s", flag.Shorthand, flag.Name)
691 } else {
692 line = fmt.Sprintf(" --%s", flag.Name)
693 }
694
695 varname, usage := UnquoteUsage(flag)
696 if varname != "" {
697 line += " " + varname
698 }
699 if flag.NoOptDefVal != "" {
700 switch flag.Value.Type() {
701 case "string":
702 line += fmt.Sprintf("[=\"%s\"]", flag.NoOptDefVal)
703 case "bool":
704 if flag.NoOptDefVal != "true" {
705 line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
706 }
707 case "count":
708 if flag.NoOptDefVal != "+1" {
709 line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
710 }
711 default:
712 line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
713 }
714 }
715
716
717
718 line += "\x00"
719 if len(line) > maxlen {
720 maxlen = len(line)
721 }
722
723 line += usage
724 if !flag.defaultIsZeroValue() {
725 if flag.Value.Type() == "string" {
726 line += fmt.Sprintf(" (default %q)", flag.DefValue)
727 } else {
728 line += fmt.Sprintf(" (default %s)", flag.DefValue)
729 }
730 }
731 if len(flag.Deprecated) != 0 {
732 line += fmt.Sprintf(" (DEPRECATED: %s)", flag.Deprecated)
733 }
734
735 lines = append(lines, line)
736 })
737
738 for _, line := range lines {
739 sidx := strings.Index(line, "\x00")
740 spacing := strings.Repeat(" ", maxlen-sidx)
741
742 fmt.Fprintln(buf, line[:sidx], spacing, wrap(maxlen+2, cols, line[sidx+1:]))
743 }
744
745 return buf.String()
746 }
747
748
749
750 func (f *FlagSet) FlagUsages() string {
751 return f.FlagUsagesWrapped(0)
752 }
753
754
755 func PrintDefaults() {
756 CommandLine.PrintDefaults()
757 }
758
759
760 func defaultUsage(f *FlagSet) {
761 fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
762 f.PrintDefaults()
763 }
764
765
766
767
768
769
770
771
772
773 var Usage = func() {
774 fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
775 PrintDefaults()
776 }
777
778
779 func (f *FlagSet) NFlag() int { return len(f.actual) }
780
781
782 func NFlag() int { return len(CommandLine.actual) }
783
784
785
786 func (f *FlagSet) Arg(i int) string {
787 if i < 0 || i >= len(f.args) {
788 return ""
789 }
790 return f.args[i]
791 }
792
793
794
795 func Arg(i int) string {
796 return CommandLine.Arg(i)
797 }
798
799
800 func (f *FlagSet) NArg() int { return len(f.args) }
801
802
803 func NArg() int { return len(CommandLine.args) }
804
805
806 func (f *FlagSet) Args() []string { return f.args }
807
808
809 func Args() []string { return CommandLine.args }
810
811
812
813
814
815
816
817 func (f *FlagSet) Var(value Value, name string, usage string) {
818 f.VarP(value, name, "", usage)
819 }
820
821
822 func (f *FlagSet) VarPF(value Value, name, shorthand, usage string) *Flag {
823
824 flag := &Flag{
825 Name: name,
826 Shorthand: shorthand,
827 Usage: usage,
828 Value: value,
829 DefValue: value.String(),
830 }
831 f.AddFlag(flag)
832 return flag
833 }
834
835
836 func (f *FlagSet) VarP(value Value, name, shorthand, usage string) {
837 f.VarPF(value, name, shorthand, usage)
838 }
839
840
841 func (f *FlagSet) AddFlag(flag *Flag) {
842 normalizedFlagName := f.normalizeFlagName(flag.Name)
843
844 _, alreadyThere := f.formal[normalizedFlagName]
845 if alreadyThere {
846 msg := fmt.Sprintf("%s flag redefined: %s", f.name, flag.Name)
847 fmt.Fprintln(f.out(), msg)
848 panic(msg)
849 }
850 if f.formal == nil {
851 f.formal = make(map[NormalizedName]*Flag)
852 }
853
854 flag.Name = string(normalizedFlagName)
855 f.formal[normalizedFlagName] = flag
856 f.orderedFormal = append(f.orderedFormal, flag)
857
858 if flag.Shorthand == "" {
859 return
860 }
861 if len(flag.Shorthand) > 1 {
862 msg := fmt.Sprintf("%q shorthand is more than one ASCII character", flag.Shorthand)
863 fmt.Fprintf(f.out(), msg)
864 panic(msg)
865 }
866 if f.shorthands == nil {
867 f.shorthands = make(map[byte]*Flag)
868 }
869 c := flag.Shorthand[0]
870 used, alreadyThere := f.shorthands[c]
871 if alreadyThere {
872 msg := fmt.Sprintf("unable to redefine %q shorthand in %q flagset: it's already used for %q flag", c, f.name, used.Name)
873 fmt.Fprintf(f.out(), msg)
874 panic(msg)
875 }
876 f.shorthands[c] = flag
877 }
878
879
880
881 func (f *FlagSet) AddFlagSet(newSet *FlagSet) {
882 if newSet == nil {
883 return
884 }
885 newSet.VisitAll(func(flag *Flag) {
886 if f.Lookup(flag.Name) == nil {
887 f.AddFlag(flag)
888 }
889 })
890 }
891
892
893
894
895
896
897
898 func Var(value Value, name string, usage string) {
899 CommandLine.VarP(value, name, "", usage)
900 }
901
902
903 func VarP(value Value, name, shorthand, usage string) {
904 CommandLine.VarP(value, name, shorthand, usage)
905 }
906
907
908
909 func (f *FlagSet) failf(format string, a ...interface{}) error {
910 err := fmt.Errorf(format, a...)
911 if f.errorHandling != ContinueOnError {
912 fmt.Fprintln(f.out(), err)
913 f.usage()
914 }
915 return err
916 }
917
918
919
920 func (f *FlagSet) usage() {
921 if f == CommandLine {
922 Usage()
923 } else if f.Usage == nil {
924 defaultUsage(f)
925 } else {
926 f.Usage()
927 }
928 }
929
930
931
932
933 func stripUnknownFlagValue(args []string) []string {
934 if len(args) == 0 {
935
936 return args
937 }
938
939 first := args[0]
940 if len(first) > 0 && first[0] == '-' {
941
942 return args
943 }
944
945
946 if len(args) > 1 {
947 return args[1:]
948 }
949 return nil
950 }
951
952 func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []string, err error) {
953 a = args
954 name := s[2:]
955 if len(name) == 0 || name[0] == '-' || name[0] == '=' {
956 err = f.failf("bad flag syntax: %s", s)
957 return
958 }
959
960 split := strings.SplitN(name, "=", 2)
961 name = split[0]
962 flag, exists := f.formal[f.normalizeFlagName(name)]
963
964 if !exists {
965 switch {
966 case name == "help":
967 f.usage()
968 return a, ErrHelp
969 case f.ParseErrorsWhitelist.UnknownFlags:
970
971
972 if len(split) >= 2 {
973 return a, nil
974 }
975
976 return stripUnknownFlagValue(a), nil
977 default:
978 err = f.failf("unknown flag: --%s", name)
979 return
980 }
981 }
982
983 var value string
984 if len(split) == 2 {
985
986 value = split[1]
987 } else if flag.NoOptDefVal != "" {
988
989 value = flag.NoOptDefVal
990 } else if len(a) > 0 {
991
992 value = a[0]
993 a = a[1:]
994 } else {
995
996 err = f.failf("flag needs an argument: %s", s)
997 return
998 }
999
1000 err = fn(flag, value)
1001 if err != nil {
1002 f.failf(err.Error())
1003 }
1004 return
1005 }
1006
1007 func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parseFunc) (outShorts string, outArgs []string, err error) {
1008 outArgs = args
1009
1010 if strings.HasPrefix(shorthands, "test.") {
1011 return
1012 }
1013
1014 outShorts = shorthands[1:]
1015 c := shorthands[0]
1016
1017 flag, exists := f.shorthands[c]
1018 if !exists {
1019 switch {
1020 case c == 'h':
1021 f.usage()
1022 err = ErrHelp
1023 return
1024 case f.ParseErrorsWhitelist.UnknownFlags:
1025
1026
1027 if len(shorthands) > 2 && shorthands[1] == '=' {
1028 outShorts = ""
1029 return
1030 }
1031
1032 outArgs = stripUnknownFlagValue(outArgs)
1033 return
1034 default:
1035 err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
1036 return
1037 }
1038 }
1039
1040 var value string
1041 if len(shorthands) > 2 && shorthands[1] == '=' {
1042
1043 value = shorthands[2:]
1044 outShorts = ""
1045 } else if flag.NoOptDefVal != "" {
1046
1047 value = flag.NoOptDefVal
1048 } else if len(shorthands) > 1 {
1049
1050 value = shorthands[1:]
1051 outShorts = ""
1052 } else if len(args) > 0 {
1053
1054 value = args[0]
1055 outArgs = args[1:]
1056 } else {
1057
1058 err = f.failf("flag needs an argument: %q in -%s", c, shorthands)
1059 return
1060 }
1061
1062 if flag.ShorthandDeprecated != "" {
1063 fmt.Fprintf(f.out(), "Flag shorthand -%s has been deprecated, %s\n", flag.Shorthand, flag.ShorthandDeprecated)
1064 }
1065
1066 err = fn(flag, value)
1067 if err != nil {
1068 f.failf(err.Error())
1069 }
1070 return
1071 }
1072
1073 func (f *FlagSet) parseShortArg(s string, args []string, fn parseFunc) (a []string, err error) {
1074 a = args
1075 shorthands := s[1:]
1076
1077
1078 for len(shorthands) > 0 {
1079 shorthands, a, err = f.parseSingleShortArg(shorthands, args, fn)
1080 if err != nil {
1081 return
1082 }
1083 }
1084
1085 return
1086 }
1087
1088 func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) {
1089 for len(args) > 0 {
1090 s := args[0]
1091 args = args[1:]
1092 if len(s) == 0 || s[0] != '-' || len(s) == 1 {
1093 if !f.interspersed {
1094 f.args = append(f.args, s)
1095 f.args = append(f.args, args...)
1096 return nil
1097 }
1098 f.args = append(f.args, s)
1099 continue
1100 }
1101
1102 if s[1] == '-' {
1103 if len(s) == 2 {
1104 f.argsLenAtDash = len(f.args)
1105 f.args = append(f.args, args...)
1106 break
1107 }
1108 args, err = f.parseLongArg(s, args, fn)
1109 } else {
1110 args, err = f.parseShortArg(s, args, fn)
1111 }
1112 if err != nil {
1113 return
1114 }
1115 }
1116 return
1117 }
1118
1119
1120
1121
1122
1123 func (f *FlagSet) Parse(arguments []string) error {
1124 if f.addedGoFlagSets != nil {
1125 for _, goFlagSet := range f.addedGoFlagSets {
1126 goFlagSet.Parse(nil)
1127 }
1128 }
1129 f.parsed = true
1130
1131 if len(arguments) < 0 {
1132 return nil
1133 }
1134
1135 f.args = make([]string, 0, len(arguments))
1136
1137 set := func(flag *Flag, value string) error {
1138 return f.Set(flag.Name, value)
1139 }
1140
1141 err := f.parseArgs(arguments, set)
1142 if err != nil {
1143 switch f.errorHandling {
1144 case ContinueOnError:
1145 return err
1146 case ExitOnError:
1147 fmt.Println(err)
1148 os.Exit(2)
1149 case PanicOnError:
1150 panic(err)
1151 }
1152 }
1153 return nil
1154 }
1155
1156 type parseFunc func(flag *Flag, value string) error
1157
1158
1159
1160
1161
1162
1163 func (f *FlagSet) ParseAll(arguments []string, fn func(flag *Flag, value string) error) error {
1164 f.parsed = true
1165 f.args = make([]string, 0, len(arguments))
1166
1167 err := f.parseArgs(arguments, fn)
1168 if err != nil {
1169 switch f.errorHandling {
1170 case ContinueOnError:
1171 return err
1172 case ExitOnError:
1173 os.Exit(2)
1174 case PanicOnError:
1175 panic(err)
1176 }
1177 }
1178 return nil
1179 }
1180
1181
1182 func (f *FlagSet) Parsed() bool {
1183 return f.parsed
1184 }
1185
1186
1187
1188 func Parse() {
1189
1190 CommandLine.Parse(os.Args[1:])
1191 }
1192
1193
1194
1195
1196 func ParseAll(fn func(flag *Flag, value string) error) {
1197
1198 CommandLine.ParseAll(os.Args[1:], fn)
1199 }
1200
1201
1202 func SetInterspersed(interspersed bool) {
1203 CommandLine.SetInterspersed(interspersed)
1204 }
1205
1206
1207 func Parsed() bool {
1208 return CommandLine.Parsed()
1209 }
1210
1211
1212 var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
1213
1214
1215
1216 func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
1217 f := &FlagSet{
1218 name: name,
1219 errorHandling: errorHandling,
1220 argsLenAtDash: -1,
1221 interspersed: true,
1222 SortFlags: true,
1223 }
1224 return f
1225 }
1226
1227
1228 func (f *FlagSet) SetInterspersed(interspersed bool) {
1229 f.interspersed = interspersed
1230 }
1231
1232
1233
1234
1235 func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
1236 f.name = name
1237 f.errorHandling = errorHandling
1238 f.argsLenAtDash = -1
1239 }
1240
View as plain text