* gcc-interface/decl.c (warn_on_field_placement): Issue the warning
[official-gcc.git] / libgo / go / flag / flag.go
blobbbbc55a2799dc86bcc4338500c2c4e1732268f20
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 /*
6 Package flag implements command-line flag parsing.
8 Usage:
10 Define flags using flag.String(), Bool(), Int(), etc.
12 This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
13 import "flag"
14 var ip = flag.Int("flagname", 1234, "help message for flagname")
15 If you like, you can bind the flag to a variable using the Var() functions.
16 var flagvar int
17 func init() {
18 flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
20 Or you can create custom flags that satisfy the Value interface (with
21 pointer receivers) and couple them to flag parsing by
22 flag.Var(&flagVal, "name", "help message for flagname")
23 For such flags, the default value is just the initial value of the variable.
25 After all flags are defined, call
26 flag.Parse()
27 to parse the command line into the defined flags.
29 Flags may then be used directly. If you're using the flags themselves,
30 they are all pointers; if you bind to variables, they're values.
31 fmt.Println("ip has value ", *ip)
32 fmt.Println("flagvar has value ", flagvar)
34 After parsing, the arguments following the flags are available as the
35 slice flag.Args() or individually as flag.Arg(i).
36 The arguments are indexed from 0 through flag.NArg()-1.
38 Command line flag syntax:
39 -flag
40 -flag=x
41 -flag x // non-boolean flags only
42 One or two minus signs may be used; they are equivalent.
43 The last form is not permitted for boolean flags because the
44 meaning of the command
45 cmd -x *
46 will change if there is a file called 0, false, etc. You must
47 use the -flag=false form to turn off a boolean flag.
49 Flag parsing stops just before the first non-flag argument
50 ("-" is a non-flag argument) or after the terminator "--".
52 Integer flags accept 1234, 0664, 0x1234 and may be negative.
53 Boolean flags may be:
54 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
55 Duration flags accept any input valid for time.ParseDuration.
57 The default set of command-line flags is controlled by
58 top-level functions. The FlagSet type allows one to define
59 independent sets of flags, such as to implement subcommands
60 in a command-line interface. The methods of FlagSet are
61 analogous to the top-level functions for the command-line
62 flag set.
64 package flag
66 import (
67 "errors"
68 "fmt"
69 "io"
70 "os"
71 "reflect"
72 "sort"
73 "strconv"
74 "time"
77 // ErrHelp is the error returned if the -help or -h flag is invoked
78 // but no such flag is defined.
79 var ErrHelp = errors.New("flag: help requested")
81 // -- bool Value
82 type boolValue bool
84 func newBoolValue(val bool, p *bool) *boolValue {
85 *p = val
86 return (*boolValue)(p)
89 func (b *boolValue) Set(s string) error {
90 v, err := strconv.ParseBool(s)
91 *b = boolValue(v)
92 return err
95 func (b *boolValue) Get() interface{} { return bool(*b) }
97 func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) }
99 func (b *boolValue) IsBoolFlag() bool { return true }
101 // optional interface to indicate boolean flags that can be
102 // supplied without "=value" text
103 type boolFlag interface {
104 Value
105 IsBoolFlag() bool
108 // -- int Value
109 type intValue int
111 func newIntValue(val int, p *int) *intValue {
112 *p = val
113 return (*intValue)(p)
116 func (i *intValue) Set(s string) error {
117 v, err := strconv.ParseInt(s, 0, 64)
118 *i = intValue(v)
119 return err
122 func (i *intValue) Get() interface{} { return int(*i) }
124 func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
126 // -- int64 Value
127 type int64Value int64
129 func newInt64Value(val int64, p *int64) *int64Value {
130 *p = val
131 return (*int64Value)(p)
134 func (i *int64Value) Set(s string) error {
135 v, err := strconv.ParseInt(s, 0, 64)
136 *i = int64Value(v)
137 return err
140 func (i *int64Value) Get() interface{} { return int64(*i) }
142 func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) }
144 // -- uint Value
145 type uintValue uint
147 func newUintValue(val uint, p *uint) *uintValue {
148 *p = val
149 return (*uintValue)(p)
152 func (i *uintValue) Set(s string) error {
153 v, err := strconv.ParseUint(s, 0, 64)
154 *i = uintValue(v)
155 return err
158 func (i *uintValue) Get() interface{} { return uint(*i) }
160 func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) }
162 // -- uint64 Value
163 type uint64Value uint64
165 func newUint64Value(val uint64, p *uint64) *uint64Value {
166 *p = val
167 return (*uint64Value)(p)
170 func (i *uint64Value) Set(s string) error {
171 v, err := strconv.ParseUint(s, 0, 64)
172 *i = uint64Value(v)
173 return err
176 func (i *uint64Value) Get() interface{} { return uint64(*i) }
178 func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
180 // -- string Value
181 type stringValue string
183 func newStringValue(val string, p *string) *stringValue {
184 *p = val
185 return (*stringValue)(p)
188 func (s *stringValue) Set(val string) error {
189 *s = stringValue(val)
190 return nil
193 func (s *stringValue) Get() interface{} { return string(*s) }
195 func (s *stringValue) String() string { return string(*s) }
197 // -- float64 Value
198 type float64Value float64
200 func newFloat64Value(val float64, p *float64) *float64Value {
201 *p = val
202 return (*float64Value)(p)
205 func (f *float64Value) Set(s string) error {
206 v, err := strconv.ParseFloat(s, 64)
207 *f = float64Value(v)
208 return err
211 func (f *float64Value) Get() interface{} { return float64(*f) }
213 func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }
215 // -- time.Duration Value
216 type durationValue time.Duration
218 func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
219 *p = val
220 return (*durationValue)(p)
223 func (d *durationValue) Set(s string) error {
224 v, err := time.ParseDuration(s)
225 *d = durationValue(v)
226 return err
229 func (d *durationValue) Get() interface{} { return time.Duration(*d) }
231 func (d *durationValue) String() string { return (*time.Duration)(d).String() }
233 // Value is the interface to the dynamic value stored in a flag.
234 // (The default value is represented as a string.)
236 // If a Value has an IsBoolFlag() bool method returning true,
237 // the command-line parser makes -name equivalent to -name=true
238 // rather than using the next command-line argument.
240 // Set is called once, in command line order, for each flag present.
241 // The flag package may call the String method with a zero-valued receiver,
242 // such as a nil pointer.
243 type Value interface {
244 String() string
245 Set(string) error
248 // Getter is an interface that allows the contents of a Value to be retrieved.
249 // It wraps the Value interface, rather than being part of it, because it
250 // appeared after Go 1 and its compatibility rules. All Value types provided
251 // by this package satisfy the Getter interface.
252 type Getter interface {
253 Value
254 Get() interface{}
257 // ErrorHandling defines how FlagSet.Parse behaves if the parse fails.
258 type ErrorHandling int
260 // These constants cause FlagSet.Parse to behave as described if the parse fails.
261 const (
262 ContinueOnError ErrorHandling = iota // Return a descriptive error.
263 ExitOnError // Call os.Exit(2).
264 PanicOnError // Call panic with a descriptive error.
267 // A FlagSet represents a set of defined flags. The zero value of a FlagSet
268 // has no name and has ContinueOnError error handling.
269 type FlagSet struct {
270 // Usage is the function called when an error occurs while parsing flags.
271 // The field is a function (not a method) that may be changed to point to
272 // a custom error handler.
273 Usage func()
275 name string
276 parsed bool
277 actual map[string]*Flag
278 formal map[string]*Flag
279 args []string // arguments after flags
280 errorHandling ErrorHandling
281 output io.Writer // nil means stderr; use out() accessor
284 // A Flag represents the state of a flag.
285 type Flag struct {
286 Name string // name as it appears on command line
287 Usage string // help message
288 Value Value // value as set
289 DefValue string // default value (as text); for usage message
292 // sortFlags returns the flags as a slice in lexicographical sorted order.
293 func sortFlags(flags map[string]*Flag) []*Flag {
294 list := make(sort.StringSlice, len(flags))
295 i := 0
296 for _, f := range flags {
297 list[i] = f.Name
300 list.Sort()
301 result := make([]*Flag, len(list))
302 for i, name := range list {
303 result[i] = flags[name]
305 return result
308 func (f *FlagSet) out() io.Writer {
309 if f.output == nil {
310 return os.Stderr
312 return f.output
315 // SetOutput sets the destination for usage and error messages.
316 // If output is nil, os.Stderr is used.
317 func (f *FlagSet) SetOutput(output io.Writer) {
318 f.output = output
321 // VisitAll visits the flags in lexicographical order, calling fn for each.
322 // It visits all flags, even those not set.
323 func (f *FlagSet) VisitAll(fn func(*Flag)) {
324 for _, flag := range sortFlags(f.formal) {
325 fn(flag)
329 // VisitAll visits the command-line flags in lexicographical order, calling
330 // fn for each. It visits all flags, even those not set.
331 func VisitAll(fn func(*Flag)) {
332 CommandLine.VisitAll(fn)
335 // Visit visits the flags in lexicographical order, calling fn for each.
336 // It visits only those flags that have been set.
337 func (f *FlagSet) Visit(fn func(*Flag)) {
338 for _, flag := range sortFlags(f.actual) {
339 fn(flag)
343 // Visit visits the command-line flags in lexicographical order, calling fn
344 // for each. It visits only those flags that have been set.
345 func Visit(fn func(*Flag)) {
346 CommandLine.Visit(fn)
349 // Lookup returns the Flag structure of the named flag, returning nil if none exists.
350 func (f *FlagSet) Lookup(name string) *Flag {
351 return f.formal[name]
354 // Lookup returns the Flag structure of the named command-line flag,
355 // returning nil if none exists.
356 func Lookup(name string) *Flag {
357 return CommandLine.formal[name]
360 // Set sets the value of the named flag.
361 func (f *FlagSet) Set(name, value string) error {
362 flag, ok := f.formal[name]
363 if !ok {
364 return fmt.Errorf("no such flag -%v", name)
366 err := flag.Value.Set(value)
367 if err != nil {
368 return err
370 if f.actual == nil {
371 f.actual = make(map[string]*Flag)
373 f.actual[name] = flag
374 return nil
377 // Set sets the value of the named command-line flag.
378 func Set(name, value string) error {
379 return CommandLine.Set(name, value)
382 // isZeroValue guesses whether the string represents the zero
383 // value for a flag. It is not accurate but in practice works OK.
384 func isZeroValue(flag *Flag, value string) bool {
385 // Build a zero value of the flag's Value type, and see if the
386 // result of calling its String method equals the value passed in.
387 // This works unless the Value type is itself an interface type.
388 typ := reflect.TypeOf(flag.Value)
389 var z reflect.Value
390 if typ.Kind() == reflect.Ptr {
391 z = reflect.New(typ.Elem())
392 } else {
393 z = reflect.Zero(typ)
395 if value == z.Interface().(Value).String() {
396 return true
399 switch value {
400 case "false":
401 return true
402 case "":
403 return true
404 case "0":
405 return true
407 return false
410 // UnquoteUsage extracts a back-quoted name from the usage
411 // string for a flag and returns it and the un-quoted usage.
412 // Given "a `name` to show" it returns ("name", "a name to show").
413 // If there are no back quotes, the name is an educated guess of the
414 // type of the flag's value, or the empty string if the flag is boolean.
415 func UnquoteUsage(flag *Flag) (name string, usage string) {
416 // Look for a back-quoted name, but avoid the strings package.
417 usage = flag.Usage
418 for i := 0; i < len(usage); i++ {
419 if usage[i] == '`' {
420 for j := i + 1; j < len(usage); j++ {
421 if usage[j] == '`' {
422 name = usage[i+1 : j]
423 usage = usage[:i] + name + usage[j+1:]
424 return name, usage
427 break // Only one back quote; use type name.
430 // No explicit name, so use type if we can find one.
431 name = "value"
432 switch flag.Value.(type) {
433 case boolFlag:
434 name = ""
435 case *durationValue:
436 name = "duration"
437 case *float64Value:
438 name = "float"
439 case *intValue, *int64Value:
440 name = "int"
441 case *stringValue:
442 name = "string"
443 case *uintValue, *uint64Value:
444 name = "uint"
446 return
449 // PrintDefaults prints to standard error the default values of all
450 // defined command-line flags in the set. See the documentation for
451 // the global function PrintDefaults for more information.
452 func (f *FlagSet) PrintDefaults() {
453 f.VisitAll(func(flag *Flag) {
454 s := fmt.Sprintf(" -%s", flag.Name) // Two spaces before -; see next two comments.
455 name, usage := UnquoteUsage(flag)
456 if len(name) > 0 {
457 s += " " + name
459 // Boolean flags of one ASCII letter are so common we
460 // treat them specially, putting their usage on the same line.
461 if len(s) <= 4 { // space, space, '-', 'x'.
462 s += "\t"
463 } else {
464 // Four spaces before the tab triggers good alignment
465 // for both 4- and 8-space tab stops.
466 s += "\n \t"
468 s += usage
469 if !isZeroValue(flag, flag.DefValue) {
470 if _, ok := flag.Value.(*stringValue); ok {
471 // put quotes on the value
472 s += fmt.Sprintf(" (default %q)", flag.DefValue)
473 } else {
474 s += fmt.Sprintf(" (default %v)", flag.DefValue)
477 fmt.Fprint(f.out(), s, "\n")
481 // PrintDefaults prints, to standard error unless configured otherwise,
482 // a usage message showing the default settings of all defined
483 // command-line flags.
484 // For an integer valued flag x, the default output has the form
485 // -x int
486 // usage-message-for-x (default 7)
487 // The usage message will appear on a separate line for anything but
488 // a bool flag with a one-byte name. For bool flags, the type is
489 // omitted and if the flag name is one byte the usage message appears
490 // on the same line. The parenthetical default is omitted if the
491 // default is the zero value for the type. The listed type, here int,
492 // can be changed by placing a back-quoted name in the flag's usage
493 // string; the first such item in the message is taken to be a parameter
494 // name to show in the message and the back quotes are stripped from
495 // the message when displayed. For instance, given
496 // flag.String("I", "", "search `directory` for include files")
497 // the output will be
498 // -I directory
499 // search directory for include files.
500 func PrintDefaults() {
501 CommandLine.PrintDefaults()
504 // defaultUsage is the default function to print a usage message.
505 func (f *FlagSet) defaultUsage() {
506 if f.name == "" {
507 fmt.Fprintf(f.out(), "Usage:\n")
508 } else {
509 fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
511 f.PrintDefaults()
514 // NOTE: Usage is not just defaultUsage(CommandLine)
515 // because it serves (via godoc flag Usage) as the example
516 // for how to write your own usage function.
518 // Usage prints to standard error a usage message documenting all defined command-line flags.
519 // It is called when an error occurs while parsing flags.
520 // The function is a variable that may be changed to point to a custom function.
521 // By default it prints a simple header and calls PrintDefaults; for details about the
522 // format of the output and how to control it, see the documentation for PrintDefaults.
523 var Usage = func() {
524 fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
525 PrintDefaults()
528 // NFlag returns the number of flags that have been set.
529 func (f *FlagSet) NFlag() int { return len(f.actual) }
531 // NFlag returns the number of command-line flags that have been set.
532 func NFlag() int { return len(CommandLine.actual) }
534 // Arg returns the i'th argument. Arg(0) is the first remaining argument
535 // after flags have been processed. Arg returns an empty string if the
536 // requested element does not exist.
537 func (f *FlagSet) Arg(i int) string {
538 if i < 0 || i >= len(f.args) {
539 return ""
541 return f.args[i]
544 // Arg returns the i'th command-line argument. Arg(0) is the first remaining argument
545 // after flags have been processed. Arg returns an empty string if the
546 // requested element does not exist.
547 func Arg(i int) string {
548 return CommandLine.Arg(i)
551 // NArg is the number of arguments remaining after flags have been processed.
552 func (f *FlagSet) NArg() int { return len(f.args) }
554 // NArg is the number of arguments remaining after flags have been processed.
555 func NArg() int { return len(CommandLine.args) }
557 // Args returns the non-flag arguments.
558 func (f *FlagSet) Args() []string { return f.args }
560 // Args returns the non-flag command-line arguments.
561 func Args() []string { return CommandLine.args }
563 // BoolVar defines a bool flag with specified name, default value, and usage string.
564 // The argument p points to a bool variable in which to store the value of the flag.
565 func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
566 f.Var(newBoolValue(value, p), name, usage)
569 // BoolVar defines a bool flag with specified name, default value, and usage string.
570 // The argument p points to a bool variable in which to store the value of the flag.
571 func BoolVar(p *bool, name string, value bool, usage string) {
572 CommandLine.Var(newBoolValue(value, p), name, usage)
575 // Bool defines a bool flag with specified name, default value, and usage string.
576 // The return value is the address of a bool variable that stores the value of the flag.
577 func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
578 p := new(bool)
579 f.BoolVar(p, name, value, usage)
580 return p
583 // Bool defines a bool flag with specified name, default value, and usage string.
584 // The return value is the address of a bool variable that stores the value of the flag.
585 func Bool(name string, value bool, usage string) *bool {
586 return CommandLine.Bool(name, value, usage)
589 // IntVar defines an int flag with specified name, default value, and usage string.
590 // The argument p points to an int variable in which to store the value of the flag.
591 func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
592 f.Var(newIntValue(value, p), name, usage)
595 // IntVar defines an int flag with specified name, default value, and usage string.
596 // The argument p points to an int variable in which to store the value of the flag.
597 func IntVar(p *int, name string, value int, usage string) {
598 CommandLine.Var(newIntValue(value, p), name, usage)
601 // Int defines an int flag with specified name, default value, and usage string.
602 // The return value is the address of an int variable that stores the value of the flag.
603 func (f *FlagSet) Int(name string, value int, usage string) *int {
604 p := new(int)
605 f.IntVar(p, name, value, usage)
606 return p
609 // Int defines an int flag with specified name, default value, and usage string.
610 // The return value is the address of an int variable that stores the value of the flag.
611 func Int(name string, value int, usage string) *int {
612 return CommandLine.Int(name, value, usage)
615 // Int64Var defines an int64 flag with specified name, default value, and usage string.
616 // The argument p points to an int64 variable in which to store the value of the flag.
617 func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
618 f.Var(newInt64Value(value, p), name, usage)
621 // Int64Var defines an int64 flag with specified name, default value, and usage string.
622 // The argument p points to an int64 variable in which to store the value of the flag.
623 func Int64Var(p *int64, name string, value int64, usage string) {
624 CommandLine.Var(newInt64Value(value, p), name, usage)
627 // Int64 defines an int64 flag with specified name, default value, and usage string.
628 // The return value is the address of an int64 variable that stores the value of the flag.
629 func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
630 p := new(int64)
631 f.Int64Var(p, name, value, usage)
632 return p
635 // Int64 defines an int64 flag with specified name, default value, and usage string.
636 // The return value is the address of an int64 variable that stores the value of the flag.
637 func Int64(name string, value int64, usage string) *int64 {
638 return CommandLine.Int64(name, value, usage)
641 // UintVar defines a uint flag with specified name, default value, and usage string.
642 // The argument p points to a uint variable in which to store the value of the flag.
643 func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
644 f.Var(newUintValue(value, p), name, usage)
647 // UintVar defines a uint flag with specified name, default value, and usage string.
648 // The argument p points to a uint variable in which to store the value of the flag.
649 func UintVar(p *uint, name string, value uint, usage string) {
650 CommandLine.Var(newUintValue(value, p), name, usage)
653 // Uint defines a uint flag with specified name, default value, and usage string.
654 // The return value is the address of a uint variable that stores the value of the flag.
655 func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
656 p := new(uint)
657 f.UintVar(p, name, value, usage)
658 return p
661 // Uint defines a uint flag with specified name, default value, and usage string.
662 // The return value is the address of a uint variable that stores the value of the flag.
663 func Uint(name string, value uint, usage string) *uint {
664 return CommandLine.Uint(name, value, usage)
667 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
668 // The argument p points to a uint64 variable in which to store the value of the flag.
669 func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
670 f.Var(newUint64Value(value, p), name, usage)
673 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
674 // The argument p points to a uint64 variable in which to store the value of the flag.
675 func Uint64Var(p *uint64, name string, value uint64, usage string) {
676 CommandLine.Var(newUint64Value(value, p), name, usage)
679 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
680 // The return value is the address of a uint64 variable that stores the value of the flag.
681 func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
682 p := new(uint64)
683 f.Uint64Var(p, name, value, usage)
684 return p
687 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
688 // The return value is the address of a uint64 variable that stores the value of the flag.
689 func Uint64(name string, value uint64, usage string) *uint64 {
690 return CommandLine.Uint64(name, value, usage)
693 // StringVar defines a string flag with specified name, default value, and usage string.
694 // The argument p points to a string variable in which to store the value of the flag.
695 func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
696 f.Var(newStringValue(value, p), name, usage)
699 // StringVar defines a string flag with specified name, default value, and usage string.
700 // The argument p points to a string variable in which to store the value of the flag.
701 func StringVar(p *string, name string, value string, usage string) {
702 CommandLine.Var(newStringValue(value, p), name, usage)
705 // String defines a string flag with specified name, default value, and usage string.
706 // The return value is the address of a string variable that stores the value of the flag.
707 func (f *FlagSet) String(name string, value string, usage string) *string {
708 p := new(string)
709 f.StringVar(p, name, value, usage)
710 return p
713 // String defines a string flag with specified name, default value, and usage string.
714 // The return value is the address of a string variable that stores the value of the flag.
715 func String(name string, value string, usage string) *string {
716 return CommandLine.String(name, value, usage)
719 // Float64Var defines a float64 flag with specified name, default value, and usage string.
720 // The argument p points to a float64 variable in which to store the value of the flag.
721 func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
722 f.Var(newFloat64Value(value, p), name, usage)
725 // Float64Var defines a float64 flag with specified name, default value, and usage string.
726 // The argument p points to a float64 variable in which to store the value of the flag.
727 func Float64Var(p *float64, name string, value float64, usage string) {
728 CommandLine.Var(newFloat64Value(value, p), name, usage)
731 // Float64 defines a float64 flag with specified name, default value, and usage string.
732 // The return value is the address of a float64 variable that stores the value of the flag.
733 func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
734 p := new(float64)
735 f.Float64Var(p, name, value, usage)
736 return p
739 // Float64 defines a float64 flag with specified name, default value, and usage string.
740 // The return value is the address of a float64 variable that stores the value of the flag.
741 func Float64(name string, value float64, usage string) *float64 {
742 return CommandLine.Float64(name, value, usage)
745 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
746 // The argument p points to a time.Duration variable in which to store the value of the flag.
747 // The flag accepts a value acceptable to time.ParseDuration.
748 func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
749 f.Var(newDurationValue(value, p), name, usage)
752 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
753 // The argument p points to a time.Duration variable in which to store the value of the flag.
754 // The flag accepts a value acceptable to time.ParseDuration.
755 func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
756 CommandLine.Var(newDurationValue(value, p), name, usage)
759 // Duration defines a time.Duration flag with specified name, default value, and usage string.
760 // The return value is the address of a time.Duration variable that stores the value of the flag.
761 // The flag accepts a value acceptable to time.ParseDuration.
762 func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
763 p := new(time.Duration)
764 f.DurationVar(p, name, value, usage)
765 return p
768 // Duration defines a time.Duration flag with specified name, default value, and usage string.
769 // The return value is the address of a time.Duration variable that stores the value of the flag.
770 // The flag accepts a value acceptable to time.ParseDuration.
771 func Duration(name string, value time.Duration, usage string) *time.Duration {
772 return CommandLine.Duration(name, value, usage)
775 // Var defines a flag with the specified name and usage string. The type and
776 // value of the flag are represented by the first argument, of type Value, which
777 // typically holds a user-defined implementation of Value. For instance, the
778 // caller could create a flag that turns a comma-separated string into a slice
779 // of strings by giving the slice the methods of Value; in particular, Set would
780 // decompose the comma-separated string into the slice.
781 func (f *FlagSet) Var(value Value, name string, usage string) {
782 // Remember the default value as a string; it won't change.
783 flag := &Flag{name, usage, value, value.String()}
784 _, alreadythere := f.formal[name]
785 if alreadythere {
786 var msg string
787 if f.name == "" {
788 msg = fmt.Sprintf("flag redefined: %s", name)
789 } else {
790 msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
792 fmt.Fprintln(f.out(), msg)
793 panic(msg) // Happens only if flags are declared with identical names
795 if f.formal == nil {
796 f.formal = make(map[string]*Flag)
798 f.formal[name] = flag
801 // Var defines a flag with the specified name and usage string. The type and
802 // value of the flag are represented by the first argument, of type Value, which
803 // typically holds a user-defined implementation of Value. For instance, the
804 // caller could create a flag that turns a comma-separated string into a slice
805 // of strings by giving the slice the methods of Value; in particular, Set would
806 // decompose the comma-separated string into the slice.
807 func Var(value Value, name string, usage string) {
808 CommandLine.Var(value, name, usage)
811 // failf prints to standard error a formatted error and usage message and
812 // returns the error.
813 func (f *FlagSet) failf(format string, a ...interface{}) error {
814 err := fmt.Errorf(format, a...)
815 fmt.Fprintln(f.out(), err)
816 f.usage()
817 return err
820 // usage calls the Usage method for the flag set if one is specified,
821 // or the appropriate default usage function otherwise.
822 func (f *FlagSet) usage() {
823 if f.Usage == nil {
824 f.defaultUsage()
825 } else {
826 f.Usage()
830 // parseOne parses one flag. It reports whether a flag was seen.
831 func (f *FlagSet) parseOne() (bool, error) {
832 if len(f.args) == 0 {
833 return false, nil
835 s := f.args[0]
836 if len(s) == 0 || s[0] != '-' || len(s) == 1 {
837 return false, nil
839 numMinuses := 1
840 if s[1] == '-' {
841 numMinuses++
842 if len(s) == 2 { // "--" terminates the flags
843 f.args = f.args[1:]
844 return false, nil
847 name := s[numMinuses:]
848 if len(name) == 0 || name[0] == '-' || name[0] == '=' {
849 return false, f.failf("bad flag syntax: %s", s)
852 // it's a flag. does it have an argument?
853 f.args = f.args[1:]
854 hasValue := false
855 value := ""
856 for i := 1; i < len(name); i++ { // equals cannot be first
857 if name[i] == '=' {
858 value = name[i+1:]
859 hasValue = true
860 name = name[0:i]
861 break
864 m := f.formal
865 flag, alreadythere := m[name] // BUG
866 if !alreadythere {
867 if name == "help" || name == "h" { // special case for nice help message.
868 f.usage()
869 return false, ErrHelp
871 return false, f.failf("flag provided but not defined: -%s", name)
874 if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
875 if hasValue {
876 if err := fv.Set(value); err != nil {
877 return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
879 } else {
880 if err := fv.Set("true"); err != nil {
881 return false, f.failf("invalid boolean flag %s: %v", name, err)
884 } else {
885 // It must have a value, which might be the next argument.
886 if !hasValue && len(f.args) > 0 {
887 // value is the next arg
888 hasValue = true
889 value, f.args = f.args[0], f.args[1:]
891 if !hasValue {
892 return false, f.failf("flag needs an argument: -%s", name)
894 if err := flag.Value.Set(value); err != nil {
895 return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
898 if f.actual == nil {
899 f.actual = make(map[string]*Flag)
901 f.actual[name] = flag
902 return true, nil
905 // Parse parses flag definitions from the argument list, which should not
906 // include the command name. Must be called after all flags in the FlagSet
907 // are defined and before flags are accessed by the program.
908 // The return value will be ErrHelp if -help or -h were set but not defined.
909 func (f *FlagSet) Parse(arguments []string) error {
910 f.parsed = true
911 f.args = arguments
912 for {
913 seen, err := f.parseOne()
914 if seen {
915 continue
917 if err == nil {
918 break
920 switch f.errorHandling {
921 case ContinueOnError:
922 return err
923 case ExitOnError:
924 os.Exit(2)
925 case PanicOnError:
926 panic(err)
929 return nil
932 // Parsed reports whether f.Parse has been called.
933 func (f *FlagSet) Parsed() bool {
934 return f.parsed
937 // Parse parses the command-line flags from os.Args[1:]. Must be called
938 // after all flags are defined and before flags are accessed by the program.
939 func Parse() {
940 // Ignore errors; CommandLine is set for ExitOnError.
941 CommandLine.Parse(os.Args[1:])
944 // Parsed reports whether the command-line flags have been parsed.
945 func Parsed() bool {
946 return CommandLine.Parsed()
949 // CommandLine is the default set of command-line flags, parsed from os.Args.
950 // The top-level functions such as BoolVar, Arg, and so on are wrappers for the
951 // methods of CommandLine.
952 var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
954 func init() {
955 // Override generic FlagSet default Usage with call to global Usage.
956 // Note: This is not CommandLine.Usage = Usage,
957 // because we want any eventual call to use any updated value of Usage,
958 // not the value it has when this line is run.
959 CommandLine.Usage = commandLineUsage
962 func commandLineUsage() {
963 Usage()
966 // NewFlagSet returns a new, empty flag set with the specified name and
967 // error handling property.
968 func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
969 f := &FlagSet{
970 name: name,
971 errorHandling: errorHandling,
973 f.Usage = f.defaultUsage
974 return f
977 // Init sets the name and error handling property for a flag set.
978 // By default, the zero FlagSet uses an empty name and the
979 // ContinueOnError error handling policy.
980 func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
981 f.name = name
982 f.errorHandling = errorHandling