github.com/letsencrypt/go@v0.0.0-20160714163537-4054769a31f6/src/flag/flag.go (about)

     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.
     4  
     5  /*
     6  	Package flag implements command-line flag parsing.
     7  
     8  	Usage:
     9  
    10  	Define flags using flag.String(), Bool(), Int(), etc.
    11  
    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")
    19  		}
    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.
    24  
    25  	After all flags are defined, call
    26  		flag.Parse()
    27  	to parse the command line into the defined flags.
    28  
    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)
    33  
    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.
    37  
    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.
    48  
    49  	Flag parsing stops just before the first non-flag argument
    50  	("-" is a non-flag argument) or after the terminator "--".
    51  
    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.
    56  
    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.
    63  */
    64  package flag
    65  
    66  import (
    67  	"errors"
    68  	"fmt"
    69  	"io"
    70  	"os"
    71  	"reflect"
    72  	"sort"
    73  	"strconv"
    74  	"time"
    75  )
    76  
    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")
    80  
    81  // -- bool Value
    82  type boolValue bool
    83  
    84  func newBoolValue(val bool, p *bool) *boolValue {
    85  	*p = val
    86  	return (*boolValue)(p)
    87  }
    88  
    89  func (b *boolValue) Set(s string) error {
    90  	v, err := strconv.ParseBool(s)
    91  	*b = boolValue(v)
    92  	return err
    93  }
    94  
    95  func (b *boolValue) Get() interface{} { return bool(*b) }
    96  
    97  func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
    98  
    99  func (b *boolValue) IsBoolFlag() bool { return true }
   100  
   101  // optional interface to indicate boolean flags that can be
   102  // supplied without "=value" text
   103  type boolFlag interface {
   104  	Value
   105  	IsBoolFlag() bool
   106  }
   107  
   108  // -- int Value
   109  type intValue int
   110  
   111  func newIntValue(val int, p *int) *intValue {
   112  	*p = val
   113  	return (*intValue)(p)
   114  }
   115  
   116  func (i *intValue) Set(s string) error {
   117  	v, err := strconv.ParseInt(s, 0, 64)
   118  	*i = intValue(v)
   119  	return err
   120  }
   121  
   122  func (i *intValue) Get() interface{} { return int(*i) }
   123  
   124  func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
   125  
   126  // -- int64 Value
   127  type int64Value int64
   128  
   129  func newInt64Value(val int64, p *int64) *int64Value {
   130  	*p = val
   131  	return (*int64Value)(p)
   132  }
   133  
   134  func (i *int64Value) Set(s string) error {
   135  	v, err := strconv.ParseInt(s, 0, 64)
   136  	*i = int64Value(v)
   137  	return err
   138  }
   139  
   140  func (i *int64Value) Get() interface{} { return int64(*i) }
   141  
   142  func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
   143  
   144  // -- uint Value
   145  type uintValue uint
   146  
   147  func newUintValue(val uint, p *uint) *uintValue {
   148  	*p = val
   149  	return (*uintValue)(p)
   150  }
   151  
   152  func (i *uintValue) Set(s string) error {
   153  	v, err := strconv.ParseUint(s, 0, 64)
   154  	*i = uintValue(v)
   155  	return err
   156  }
   157  
   158  func (i *uintValue) Get() interface{} { return uint(*i) }
   159  
   160  func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
   161  
   162  // -- uint64 Value
   163  type uint64Value uint64
   164  
   165  func newUint64Value(val uint64, p *uint64) *uint64Value {
   166  	*p = val
   167  	return (*uint64Value)(p)
   168  }
   169  
   170  func (i *uint64Value) Set(s string) error {
   171  	v, err := strconv.ParseUint(s, 0, 64)
   172  	*i = uint64Value(v)
   173  	return err
   174  }
   175  
   176  func (i *uint64Value) Get() interface{} { return uint64(*i) }
   177  
   178  func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
   179  
   180  // -- string Value
   181  type stringValue string
   182  
   183  func newStringValue(val string, p *string) *stringValue {
   184  	*p = val
   185  	return (*stringValue)(p)
   186  }
   187  
   188  func (s *stringValue) Set(val string) error {
   189  	*s = stringValue(val)
   190  	return nil
   191  }
   192  
   193  func (s *stringValue) Get() interface{} { return string(*s) }
   194  
   195  func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
   196  
   197  // -- float64 Value
   198  type float64Value float64
   199  
   200  func newFloat64Value(val float64, p *float64) *float64Value {
   201  	*p = val
   202  	return (*float64Value)(p)
   203  }
   204  
   205  func (f *float64Value) Set(s string) error {
   206  	v, err := strconv.ParseFloat(s, 64)
   207  	*f = float64Value(v)
   208  	return err
   209  }
   210  
   211  func (f *float64Value) Get() interface{} { return float64(*f) }
   212  
   213  func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
   214  
   215  // -- time.Duration Value
   216  type durationValue time.Duration
   217  
   218  func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
   219  	*p = val
   220  	return (*durationValue)(p)
   221  }
   222  
   223  func (d *durationValue) Set(s string) error {
   224  	v, err := time.ParseDuration(s)
   225  	*d = durationValue(v)
   226  	return err
   227  }
   228  
   229  func (d *durationValue) Get() interface{} { return time.Duration(*d) }
   230  
   231  func (d *durationValue) String() string { return (*time.Duration)(d).String() }
   232  
   233  // Value is the interface to the dynamic value stored in a flag.
   234  // (The default value is represented as a string.)
   235  //
   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.
   239  //
   240  // Set is called once, in command line order, for each flag present.
   241  type Value interface {
   242  	String() string
   243  	Set(string) error
   244  }
   245  
   246  // Getter is an interface that allows the contents of a Value to be retrieved.
   247  // It wraps the Value interface, rather than being part of it, because it
   248  // appeared after Go 1 and its compatibility rules. All Value types provided
   249  // by this package satisfy the Getter interface.
   250  type Getter interface {
   251  	Value
   252  	Get() interface{}
   253  }
   254  
   255  // ErrorHandling defines how FlagSet.Parse behaves if the parse fails.
   256  type ErrorHandling int
   257  
   258  // These constants cause FlagSet.Parse to behave as described if the parse fails.
   259  const (
   260  	ContinueOnError ErrorHandling = iota // Return a descriptive error.
   261  	ExitOnError                          // Call os.Exit(2).
   262  	PanicOnError                         // Call panic with a descriptive error.
   263  )
   264  
   265  // A FlagSet represents a set of defined flags. The zero value of a FlagSet
   266  // has no name and has ContinueOnError error handling.
   267  type FlagSet struct {
   268  	// Usage is the function called when an error occurs while parsing flags.
   269  	// The field is a function (not a method) that may be changed to point to
   270  	// a custom error handler.
   271  	Usage func()
   272  
   273  	name          string
   274  	parsed        bool
   275  	actual        map[string]*Flag
   276  	formal        map[string]*Flag
   277  	args          []string // arguments after flags
   278  	errorHandling ErrorHandling
   279  	output        io.Writer // nil means stderr; use out() accessor
   280  }
   281  
   282  // A Flag represents the state of a flag.
   283  type Flag struct {
   284  	Name     string // name as it appears on command line
   285  	Usage    string // help message
   286  	Value    Value  // value as set
   287  	DefValue string // default value (as text); for usage message
   288  }
   289  
   290  // sortFlags returns the flags as a slice in lexicographical sorted order.
   291  func sortFlags(flags map[string]*Flag) []*Flag {
   292  	list := make(sort.StringSlice, len(flags))
   293  	i := 0
   294  	for _, f := range flags {
   295  		list[i] = f.Name
   296  		i++
   297  	}
   298  	list.Sort()
   299  	result := make([]*Flag, len(list))
   300  	for i, name := range list {
   301  		result[i] = flags[name]
   302  	}
   303  	return result
   304  }
   305  
   306  func (f *FlagSet) out() io.Writer {
   307  	if f.output == nil {
   308  		return os.Stderr
   309  	}
   310  	return f.output
   311  }
   312  
   313  // SetOutput sets the destination for usage and error messages.
   314  // If output is nil, os.Stderr is used.
   315  func (f *FlagSet) SetOutput(output io.Writer) {
   316  	f.output = output
   317  }
   318  
   319  // VisitAll visits the flags in lexicographical order, calling fn for each.
   320  // It visits all flags, even those not set.
   321  func (f *FlagSet) VisitAll(fn func(*Flag)) {
   322  	for _, flag := range sortFlags(f.formal) {
   323  		fn(flag)
   324  	}
   325  }
   326  
   327  // VisitAll visits the command-line flags in lexicographical order, calling
   328  // fn for each. It visits all flags, even those not set.
   329  func VisitAll(fn func(*Flag)) {
   330  	CommandLine.VisitAll(fn)
   331  }
   332  
   333  // Visit visits the flags in lexicographical order, calling fn for each.
   334  // It visits only those flags that have been set.
   335  func (f *FlagSet) Visit(fn func(*Flag)) {
   336  	for _, flag := range sortFlags(f.actual) {
   337  		fn(flag)
   338  	}
   339  }
   340  
   341  // Visit visits the command-line flags in lexicographical order, calling fn
   342  // for each. It visits only those flags that have been set.
   343  func Visit(fn func(*Flag)) {
   344  	CommandLine.Visit(fn)
   345  }
   346  
   347  // Lookup returns the Flag structure of the named flag, returning nil if none exists.
   348  func (f *FlagSet) Lookup(name string) *Flag {
   349  	return f.formal[name]
   350  }
   351  
   352  // Lookup returns the Flag structure of the named command-line flag,
   353  // returning nil if none exists.
   354  func Lookup(name string) *Flag {
   355  	return CommandLine.formal[name]
   356  }
   357  
   358  // Set sets the value of the named flag.
   359  func (f *FlagSet) Set(name, value string) error {
   360  	flag, ok := f.formal[name]
   361  	if !ok {
   362  		return fmt.Errorf("no such flag -%v", name)
   363  	}
   364  	err := flag.Value.Set(value)
   365  	if err != nil {
   366  		return err
   367  	}
   368  	if f.actual == nil {
   369  		f.actual = make(map[string]*Flag)
   370  	}
   371  	f.actual[name] = flag
   372  	return nil
   373  }
   374  
   375  // Set sets the value of the named command-line flag.
   376  func Set(name, value string) error {
   377  	return CommandLine.Set(name, value)
   378  }
   379  
   380  // isZeroValue guesses whether the string represents the zero
   381  // value for a flag. It is not accurate but in practice works OK.
   382  func isZeroValue(flag *Flag, value string) bool {
   383  	// Build a zero value of the flag's Value type, and see if the
   384  	// result of calling its String method equals the value passed in.
   385  	// This works unless the Value type is itself an interface type.
   386  	typ := reflect.TypeOf(flag.Value)
   387  	var z reflect.Value
   388  	if typ.Kind() == reflect.Ptr {
   389  		z = reflect.New(typ.Elem())
   390  	} else {
   391  		z = reflect.Zero(typ)
   392  	}
   393  	if value == z.Interface().(Value).String() {
   394  		return true
   395  	}
   396  
   397  	switch value {
   398  	case "false":
   399  		return true
   400  	case "":
   401  		return true
   402  	case "0":
   403  		return true
   404  	}
   405  	return false
   406  }
   407  
   408  // UnquoteUsage extracts a back-quoted name from the usage
   409  // string for a flag and returns it and the un-quoted usage.
   410  // Given "a `name` to show" it returns ("name", "a name to show").
   411  // If there are no back quotes, the name is an educated guess of the
   412  // type of the flag's value, or the empty string if the flag is boolean.
   413  func UnquoteUsage(flag *Flag) (name string, usage string) {
   414  	// Look for a back-quoted name, but avoid the strings package.
   415  	usage = flag.Usage
   416  	for i := 0; i < len(usage); i++ {
   417  		if usage[i] == '`' {
   418  			for j := i + 1; j < len(usage); j++ {
   419  				if usage[j] == '`' {
   420  					name = usage[i+1 : j]
   421  					usage = usage[:i] + name + usage[j+1:]
   422  					return name, usage
   423  				}
   424  			}
   425  			break // Only one back quote; use type name.
   426  		}
   427  	}
   428  	// No explicit name, so use type if we can find one.
   429  	name = "value"
   430  	switch flag.Value.(type) {
   431  	case boolFlag:
   432  		name = ""
   433  	case *durationValue:
   434  		name = "duration"
   435  	case *float64Value:
   436  		name = "float"
   437  	case *intValue, *int64Value:
   438  		name = "int"
   439  	case *stringValue:
   440  		name = "string"
   441  	case *uintValue, *uint64Value:
   442  		name = "uint"
   443  	}
   444  	return
   445  }
   446  
   447  // PrintDefaults prints to standard error the default values of all
   448  // defined command-line flags in the set. See the documentation for
   449  // the global function PrintDefaults for more information.
   450  func (f *FlagSet) PrintDefaults() {
   451  	f.VisitAll(func(flag *Flag) {
   452  		s := fmt.Sprintf("  -%s", flag.Name) // Two spaces before -; see next two comments.
   453  		name, usage := UnquoteUsage(flag)
   454  		if len(name) > 0 {
   455  			s += " " + name
   456  		}
   457  		// Boolean flags of one ASCII letter are so common we
   458  		// treat them specially, putting their usage on the same line.
   459  		if len(s) <= 4 { // space, space, '-', 'x'.
   460  			s += "\t"
   461  		} else {
   462  			// Four spaces before the tab triggers good alignment
   463  			// for both 4- and 8-space tab stops.
   464  			s += "\n    \t"
   465  		}
   466  		s += usage
   467  		if !isZeroValue(flag, flag.DefValue) {
   468  			if _, ok := flag.Value.(*stringValue); ok {
   469  				// put quotes on the value
   470  				s += fmt.Sprintf(" (default %q)", flag.DefValue)
   471  			} else {
   472  				s += fmt.Sprintf(" (default %v)", flag.DefValue)
   473  			}
   474  		}
   475  		fmt.Fprint(f.out(), s, "\n")
   476  	})
   477  }
   478  
   479  // PrintDefaults prints, to standard error unless configured otherwise,
   480  // a usage message showing the default settings of all defined
   481  // command-line flags.
   482  // For an integer valued flag x, the default output has the form
   483  //	-x int
   484  //		usage-message-for-x (default 7)
   485  // The usage message will appear on a separate line for anything but
   486  // a bool flag with a one-byte name. For bool flags, the type is
   487  // omitted and if the flag name is one byte the usage message appears
   488  // on the same line. The parenthetical default is omitted if the
   489  // default is the zero value for the type. The listed type, here int,
   490  // can be changed by placing a back-quoted name in the flag's usage
   491  // string; the first such item in the message is taken to be a parameter
   492  // name to show in the message and the back quotes are stripped from
   493  // the message when displayed. For instance, given
   494  //	flag.String("I", "", "search `directory` for include files")
   495  // the output will be
   496  //	-I directory
   497  //		search directory for include files.
   498  func PrintDefaults() {
   499  	CommandLine.PrintDefaults()
   500  }
   501  
   502  // defaultUsage is the default function to print a usage message.
   503  func defaultUsage(f *FlagSet) {
   504  	if f.name == "" {
   505  		fmt.Fprintf(f.out(), "Usage:\n")
   506  	} else {
   507  		fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
   508  	}
   509  	f.PrintDefaults()
   510  }
   511  
   512  // NOTE: Usage is not just defaultUsage(CommandLine)
   513  // because it serves (via godoc flag Usage) as the example
   514  // for how to write your own usage function.
   515  
   516  // Usage prints to standard error a usage message documenting all defined command-line flags.
   517  // It is called when an error occurs while parsing flags.
   518  // The function is a variable that may be changed to point to a custom function.
   519  // By default it prints a simple header and calls PrintDefaults; for details about the
   520  // format of the output and how to control it, see the documentation for PrintDefaults.
   521  var Usage = func() {
   522  	fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
   523  	PrintDefaults()
   524  }
   525  
   526  // NFlag returns the number of flags that have been set.
   527  func (f *FlagSet) NFlag() int { return len(f.actual) }
   528  
   529  // NFlag returns the number of command-line flags that have been set.
   530  func NFlag() int { return len(CommandLine.actual) }
   531  
   532  // Arg returns the i'th argument. Arg(0) is the first remaining argument
   533  // after flags have been processed. Arg returns an empty string if the
   534  // requested element does not exist.
   535  func (f *FlagSet) Arg(i int) string {
   536  	if i < 0 || i >= len(f.args) {
   537  		return ""
   538  	}
   539  	return f.args[i]
   540  }
   541  
   542  // Arg returns the i'th command-line argument. Arg(0) is the first remaining argument
   543  // after flags have been processed. Arg returns an empty string if the
   544  // requested element does not exist.
   545  func Arg(i int) string {
   546  	return CommandLine.Arg(i)
   547  }
   548  
   549  // NArg is the number of arguments remaining after flags have been processed.
   550  func (f *FlagSet) NArg() int { return len(f.args) }
   551  
   552  // NArg is the number of arguments remaining after flags have been processed.
   553  func NArg() int { return len(CommandLine.args) }
   554  
   555  // Args returns the non-flag arguments.
   556  func (f *FlagSet) Args() []string { return f.args }
   557  
   558  // Args returns the non-flag command-line arguments.
   559  func Args() []string { return CommandLine.args }
   560  
   561  // BoolVar defines a bool flag with specified name, default value, and usage string.
   562  // The argument p points to a bool variable in which to store the value of the flag.
   563  func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
   564  	f.Var(newBoolValue(value, p), name, usage)
   565  }
   566  
   567  // BoolVar defines a bool flag with specified name, default value, and usage string.
   568  // The argument p points to a bool variable in which to store the value of the flag.
   569  func BoolVar(p *bool, name string, value bool, usage string) {
   570  	CommandLine.Var(newBoolValue(value, p), name, usage)
   571  }
   572  
   573  // Bool defines a bool flag with specified name, default value, and usage string.
   574  // The return value is the address of a bool variable that stores the value of the flag.
   575  func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
   576  	p := new(bool)
   577  	f.BoolVar(p, name, value, usage)
   578  	return p
   579  }
   580  
   581  // Bool defines a bool flag with specified name, default value, and usage string.
   582  // The return value is the address of a bool variable that stores the value of the flag.
   583  func Bool(name string, value bool, usage string) *bool {
   584  	return CommandLine.Bool(name, value, usage)
   585  }
   586  
   587  // IntVar defines an int flag with specified name, default value, and usage string.
   588  // The argument p points to an int variable in which to store the value of the flag.
   589  func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
   590  	f.Var(newIntValue(value, p), name, usage)
   591  }
   592  
   593  // IntVar defines an int flag with specified name, default value, and usage string.
   594  // The argument p points to an int variable in which to store the value of the flag.
   595  func IntVar(p *int, name string, value int, usage string) {
   596  	CommandLine.Var(newIntValue(value, p), name, usage)
   597  }
   598  
   599  // Int defines an int flag with specified name, default value, and usage string.
   600  // The return value is the address of an int variable that stores the value of the flag.
   601  func (f *FlagSet) Int(name string, value int, usage string) *int {
   602  	p := new(int)
   603  	f.IntVar(p, name, value, usage)
   604  	return p
   605  }
   606  
   607  // Int defines an int flag with specified name, default value, and usage string.
   608  // The return value is the address of an int variable that stores the value of the flag.
   609  func Int(name string, value int, usage string) *int {
   610  	return CommandLine.Int(name, value, usage)
   611  }
   612  
   613  // Int64Var defines an int64 flag with specified name, default value, and usage string.
   614  // The argument p points to an int64 variable in which to store the value of the flag.
   615  func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
   616  	f.Var(newInt64Value(value, p), name, usage)
   617  }
   618  
   619  // Int64Var defines an int64 flag with specified name, default value, and usage string.
   620  // The argument p points to an int64 variable in which to store the value of the flag.
   621  func Int64Var(p *int64, name string, value int64, usage string) {
   622  	CommandLine.Var(newInt64Value(value, p), name, usage)
   623  }
   624  
   625  // Int64 defines an int64 flag with specified name, default value, and usage string.
   626  // The return value is the address of an int64 variable that stores the value of the flag.
   627  func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
   628  	p := new(int64)
   629  	f.Int64Var(p, name, value, usage)
   630  	return p
   631  }
   632  
   633  // Int64 defines an int64 flag with specified name, default value, and usage string.
   634  // The return value is the address of an int64 variable that stores the value of the flag.
   635  func Int64(name string, value int64, usage string) *int64 {
   636  	return CommandLine.Int64(name, value, usage)
   637  }
   638  
   639  // UintVar defines a uint flag with specified name, default value, and usage string.
   640  // The argument p points to a uint variable in which to store the value of the flag.
   641  func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
   642  	f.Var(newUintValue(value, p), name, usage)
   643  }
   644  
   645  // UintVar defines a uint flag with specified name, default value, and usage string.
   646  // The argument p points to a uint  variable in which to store the value of the flag.
   647  func UintVar(p *uint, name string, value uint, usage string) {
   648  	CommandLine.Var(newUintValue(value, p), name, usage)
   649  }
   650  
   651  // Uint defines a uint flag with specified name, default value, and usage string.
   652  // The return value is the address of a uint  variable that stores the value of the flag.
   653  func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
   654  	p := new(uint)
   655  	f.UintVar(p, name, value, usage)
   656  	return p
   657  }
   658  
   659  // Uint defines a uint flag with specified name, default value, and usage string.
   660  // The return value is the address of a uint  variable that stores the value of the flag.
   661  func Uint(name string, value uint, usage string) *uint {
   662  	return CommandLine.Uint(name, value, usage)
   663  }
   664  
   665  // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
   666  // The argument p points to a uint64 variable in which to store the value of the flag.
   667  func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
   668  	f.Var(newUint64Value(value, p), name, usage)
   669  }
   670  
   671  // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
   672  // The argument p points to a uint64 variable in which to store the value of the flag.
   673  func Uint64Var(p *uint64, name string, value uint64, usage string) {
   674  	CommandLine.Var(newUint64Value(value, p), name, usage)
   675  }
   676  
   677  // Uint64 defines a uint64 flag with specified name, default value, and usage string.
   678  // The return value is the address of a uint64 variable that stores the value of the flag.
   679  func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
   680  	p := new(uint64)
   681  	f.Uint64Var(p, name, value, usage)
   682  	return p
   683  }
   684  
   685  // Uint64 defines a uint64 flag with specified name, default value, and usage string.
   686  // The return value is the address of a uint64 variable that stores the value of the flag.
   687  func Uint64(name string, value uint64, usage string) *uint64 {
   688  	return CommandLine.Uint64(name, value, usage)
   689  }
   690  
   691  // StringVar defines a string flag with specified name, default value, and usage string.
   692  // The argument p points to a string variable in which to store the value of the flag.
   693  func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
   694  	f.Var(newStringValue(value, p), name, usage)
   695  }
   696  
   697  // StringVar defines a string flag with specified name, default value, and usage string.
   698  // The argument p points to a string variable in which to store the value of the flag.
   699  func StringVar(p *string, name string, value string, usage string) {
   700  	CommandLine.Var(newStringValue(value, p), name, usage)
   701  }
   702  
   703  // String defines a string flag with specified name, default value, and usage string.
   704  // The return value is the address of a string variable that stores the value of the flag.
   705  func (f *FlagSet) String(name string, value string, usage string) *string {
   706  	p := new(string)
   707  	f.StringVar(p, name, value, usage)
   708  	return p
   709  }
   710  
   711  // String defines a string flag with specified name, default value, and usage string.
   712  // The return value is the address of a string variable that stores the value of the flag.
   713  func String(name string, value string, usage string) *string {
   714  	return CommandLine.String(name, value, usage)
   715  }
   716  
   717  // Float64Var defines a float64 flag with specified name, default value, and usage string.
   718  // The argument p points to a float64 variable in which to store the value of the flag.
   719  func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
   720  	f.Var(newFloat64Value(value, p), name, usage)
   721  }
   722  
   723  // Float64Var defines a float64 flag with specified name, default value, and usage string.
   724  // The argument p points to a float64 variable in which to store the value of the flag.
   725  func Float64Var(p *float64, name string, value float64, usage string) {
   726  	CommandLine.Var(newFloat64Value(value, p), name, usage)
   727  }
   728  
   729  // Float64 defines a float64 flag with specified name, default value, and usage string.
   730  // The return value is the address of a float64 variable that stores the value of the flag.
   731  func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
   732  	p := new(float64)
   733  	f.Float64Var(p, name, value, usage)
   734  	return p
   735  }
   736  
   737  // Float64 defines a float64 flag with specified name, default value, and usage string.
   738  // The return value is the address of a float64 variable that stores the value of the flag.
   739  func Float64(name string, value float64, usage string) *float64 {
   740  	return CommandLine.Float64(name, value, usage)
   741  }
   742  
   743  // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
   744  // The argument p points to a time.Duration variable in which to store the value of the flag.
   745  // The flag accepts a value acceptable to time.ParseDuration.
   746  func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
   747  	f.Var(newDurationValue(value, p), name, usage)
   748  }
   749  
   750  // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
   751  // The argument p points to a time.Duration variable in which to store the value of the flag.
   752  // The flag accepts a value acceptable to time.ParseDuration.
   753  func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
   754  	CommandLine.Var(newDurationValue(value, p), name, usage)
   755  }
   756  
   757  // Duration defines a time.Duration flag with specified name, default value, and usage string.
   758  // The return value is the address of a time.Duration variable that stores the value of the flag.
   759  // The flag accepts a value acceptable to time.ParseDuration.
   760  func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
   761  	p := new(time.Duration)
   762  	f.DurationVar(p, name, value, usage)
   763  	return p
   764  }
   765  
   766  // Duration defines a time.Duration flag with specified name, default value, and usage string.
   767  // The return value is the address of a time.Duration variable that stores the value of the flag.
   768  // The flag accepts a value acceptable to time.ParseDuration.
   769  func Duration(name string, value time.Duration, usage string) *time.Duration {
   770  	return CommandLine.Duration(name, value, usage)
   771  }
   772  
   773  // Var defines a flag with the specified name and usage string. The type and
   774  // value of the flag are represented by the first argument, of type Value, which
   775  // typically holds a user-defined implementation of Value. For instance, the
   776  // caller could create a flag that turns a comma-separated string into a slice
   777  // of strings by giving the slice the methods of Value; in particular, Set would
   778  // decompose the comma-separated string into the slice.
   779  func (f *FlagSet) Var(value Value, name string, usage string) {
   780  	// Remember the default value as a string; it won't change.
   781  	flag := &Flag{name, usage, value, value.String()}
   782  	_, alreadythere := f.formal[name]
   783  	if alreadythere {
   784  		var msg string
   785  		if f.name == "" {
   786  			msg = fmt.Sprintf("flag redefined: %s", name)
   787  		} else {
   788  			msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
   789  		}
   790  		fmt.Fprintln(f.out(), msg)
   791  		panic(msg) // Happens only if flags are declared with identical names
   792  	}
   793  	if f.formal == nil {
   794  		f.formal = make(map[string]*Flag)
   795  	}
   796  	f.formal[name] = flag
   797  }
   798  
   799  // Var defines a flag with the specified name and usage string. The type and
   800  // value of the flag are represented by the first argument, of type Value, which
   801  // typically holds a user-defined implementation of Value. For instance, the
   802  // caller could create a flag that turns a comma-separated string into a slice
   803  // of strings by giving the slice the methods of Value; in particular, Set would
   804  // decompose the comma-separated string into the slice.
   805  func Var(value Value, name string, usage string) {
   806  	CommandLine.Var(value, name, usage)
   807  }
   808  
   809  // failf prints to standard error a formatted error and usage message and
   810  // returns the error.
   811  func (f *FlagSet) failf(format string, a ...interface{}) error {
   812  	err := fmt.Errorf(format, a...)
   813  	fmt.Fprintln(f.out(), err)
   814  	f.usage()
   815  	return err
   816  }
   817  
   818  // usage calls the Usage method for the flag set if one is specified,
   819  // or the appropriate default usage function otherwise.
   820  func (f *FlagSet) usage() {
   821  	if f.Usage == nil {
   822  		if f == CommandLine {
   823  			Usage()
   824  		} else {
   825  			defaultUsage(f)
   826  		}
   827  	} else {
   828  		f.Usage()
   829  	}
   830  }
   831  
   832  // parseOne parses one flag. It reports whether a flag was seen.
   833  func (f *FlagSet) parseOne() (bool, error) {
   834  	if len(f.args) == 0 {
   835  		return false, nil
   836  	}
   837  	s := f.args[0]
   838  	if len(s) == 0 || s[0] != '-' || len(s) == 1 {
   839  		return false, nil
   840  	}
   841  	numMinuses := 1
   842  	if s[1] == '-' {
   843  		numMinuses++
   844  		if len(s) == 2 { // "--" terminates the flags
   845  			f.args = f.args[1:]
   846  			return false, nil
   847  		}
   848  	}
   849  	name := s[numMinuses:]
   850  	if len(name) == 0 || name[0] == '-' || name[0] == '=' {
   851  		return false, f.failf("bad flag syntax: %s", s)
   852  	}
   853  
   854  	// it's a flag. does it have an argument?
   855  	f.args = f.args[1:]
   856  	hasValue := false
   857  	value := ""
   858  	for i := 1; i < len(name); i++ { // equals cannot be first
   859  		if name[i] == '=' {
   860  			value = name[i+1:]
   861  			hasValue = true
   862  			name = name[0:i]
   863  			break
   864  		}
   865  	}
   866  	m := f.formal
   867  	flag, alreadythere := m[name] // BUG
   868  	if !alreadythere {
   869  		if name == "help" || name == "h" { // special case for nice help message.
   870  			f.usage()
   871  			return false, ErrHelp
   872  		}
   873  		return false, f.failf("flag provided but not defined: -%s", name)
   874  	}
   875  
   876  	if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
   877  		if hasValue {
   878  			if err := fv.Set(value); err != nil {
   879  				return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
   880  			}
   881  		} else {
   882  			if err := fv.Set("true"); err != nil {
   883  				return false, f.failf("invalid boolean flag %s: %v", name, err)
   884  			}
   885  		}
   886  	} else {
   887  		// It must have a value, which might be the next argument.
   888  		if !hasValue && len(f.args) > 0 {
   889  			// value is the next arg
   890  			hasValue = true
   891  			value, f.args = f.args[0], f.args[1:]
   892  		}
   893  		if !hasValue {
   894  			return false, f.failf("flag needs an argument: -%s", name)
   895  		}
   896  		if err := flag.Value.Set(value); err != nil {
   897  			return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
   898  		}
   899  	}
   900  	if f.actual == nil {
   901  		f.actual = make(map[string]*Flag)
   902  	}
   903  	f.actual[name] = flag
   904  	return true, nil
   905  }
   906  
   907  // Parse parses flag definitions from the argument list, which should not
   908  // include the command name. Must be called after all flags in the FlagSet
   909  // are defined and before flags are accessed by the program.
   910  // The return value will be ErrHelp if -help or -h were set but not defined.
   911  func (f *FlagSet) Parse(arguments []string) error {
   912  	f.parsed = true
   913  	f.args = arguments
   914  	for {
   915  		seen, err := f.parseOne()
   916  		if seen {
   917  			continue
   918  		}
   919  		if err == nil {
   920  			break
   921  		}
   922  		switch f.errorHandling {
   923  		case ContinueOnError:
   924  			return err
   925  		case ExitOnError:
   926  			os.Exit(2)
   927  		case PanicOnError:
   928  			panic(err)
   929  		}
   930  	}
   931  	return nil
   932  }
   933  
   934  // Parsed reports whether f.Parse has been called.
   935  func (f *FlagSet) Parsed() bool {
   936  	return f.parsed
   937  }
   938  
   939  // Parse parses the command-line flags from os.Args[1:].  Must be called
   940  // after all flags are defined and before flags are accessed by the program.
   941  func Parse() {
   942  	// Ignore errors; CommandLine is set for ExitOnError.
   943  	CommandLine.Parse(os.Args[1:])
   944  }
   945  
   946  // Parsed reports whether the command-line flags have been parsed.
   947  func Parsed() bool {
   948  	return CommandLine.Parsed()
   949  }
   950  
   951  // CommandLine is the default set of command-line flags, parsed from os.Args.
   952  // The top-level functions such as BoolVar, Arg, and so on are wrappers for the
   953  // methods of CommandLine.
   954  var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
   955  
   956  // NewFlagSet returns a new, empty flag set with the specified name and
   957  // error handling property.
   958  func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
   959  	f := &FlagSet{
   960  		name:          name,
   961  		errorHandling: errorHandling,
   962  	}
   963  	return f
   964  }
   965  
   966  // Init sets the name and error handling property for a flag set.
   967  // By default, the zero FlagSet uses an empty name and the
   968  // ContinueOnError error handling policy.
   969  func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
   970  	f.name = name
   971  	f.errorHandling = errorHandling
   972  }