github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/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 strconv.FormatBool(bool(*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, strconv.IntSize) 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 strconv.Itoa(int(*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 strconv.FormatInt(int64(*i), 10) } 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, strconv.IntSize) 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 strconv.FormatUint(uint64(*i), 10) } 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 strconv.FormatUint(uint64(*i), 10) } 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 string(*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 strconv.FormatFloat(float64(*f), 'g', -1, 64) } 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 // 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 246 } 247 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{} 255 } 256 257 // ErrorHandling defines how FlagSet.Parse behaves if the parse fails. 258 type ErrorHandling int 259 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. 265 ) 266 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() 274 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 282 } 283 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 290 } 291 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 298 i++ 299 } 300 list.Sort() 301 result := make([]*Flag, len(list)) 302 for i, name := range list { 303 result[i] = flags[name] 304 } 305 return result 306 } 307 308 func (f *FlagSet) out() io.Writer { 309 if f.output == nil { 310 return os.Stderr 311 } 312 return f.output 313 } 314 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 319 } 320 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) 326 } 327 } 328 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) 333 } 334 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) 340 } 341 } 342 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) 347 } 348 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] 352 } 353 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] 358 } 359 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) 365 } 366 err := flag.Value.Set(value) 367 if err != nil { 368 return err 369 } 370 if f.actual == nil { 371 f.actual = make(map[string]*Flag) 372 } 373 f.actual[name] = flag 374 return nil 375 } 376 377 // Set sets the value of the named command-line flag. 378 func Set(name, value string) error { 379 return CommandLine.Set(name, value) 380 } 381 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) 394 } 395 if value == z.Interface().(Value).String() { 396 return true 397 } 398 399 switch value { 400 case "false": 401 return true 402 case "": 403 return true 404 case "0": 405 return true 406 } 407 return false 408 } 409 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 425 } 426 } 427 break // Only one back quote; use type name. 428 } 429 } 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" 445 } 446 return 447 } 448 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 458 } 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" 467 } 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) 475 } 476 } 477 fmt.Fprint(f.out(), s, "\n") 478 }) 479 } 480 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() 502 } 503 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) 510 } 511 f.PrintDefaults() 512 } 513 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. 517 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() 526 } 527 528 // NFlag returns the number of flags that have been set. 529 func (f *FlagSet) NFlag() int { return len(f.actual) } 530 531 // NFlag returns the number of command-line flags that have been set. 532 func NFlag() int { return len(CommandLine.actual) } 533 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 "" 540 } 541 return f.args[i] 542 } 543 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) 549 } 550 551 // NArg is the number of arguments remaining after flags have been processed. 552 func (f *FlagSet) NArg() int { return len(f.args) } 553 554 // NArg is the number of arguments remaining after flags have been processed. 555 func NArg() int { return len(CommandLine.args) } 556 557 // Args returns the non-flag arguments. 558 func (f *FlagSet) Args() []string { return f.args } 559 560 // Args returns the non-flag command-line arguments. 561 func Args() []string { return CommandLine.args } 562 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) 567 } 568 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) 573 } 574 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 581 } 582 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) 587 } 588 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) 593 } 594 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) 599 } 600 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 607 } 608 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) 613 } 614 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) 619 } 620 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) 625 } 626 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 633 } 634 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) 639 } 640 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) 645 } 646 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) 651 } 652 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 659 } 660 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) 665 } 666 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) 671 } 672 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) 677 } 678 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 685 } 686 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) 691 } 692 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) 697 } 698 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) 703 } 704 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 711 } 712 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) 717 } 718 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) 723 } 724 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) 729 } 730 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 737 } 738 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) 743 } 744 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) 750 } 751 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) 757 } 758 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 766 } 767 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) 773 } 774 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) 791 } 792 fmt.Fprintln(f.out(), msg) 793 panic(msg) // Happens only if flags are declared with identical names 794 } 795 if f.formal == nil { 796 f.formal = make(map[string]*Flag) 797 } 798 f.formal[name] = flag 799 } 800 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) 809 } 810 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 818 } 819 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() 827 } 828 } 829 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 834 } 835 s := f.args[0] 836 if len(s) == 0 || s[0] != '-' || len(s) == 1 { 837 return false, nil 838 } 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 845 } 846 } 847 name := s[numMinuses:] 848 if len(name) == 0 || name[0] == '-' || name[0] == '=' { 849 return false, f.failf("bad flag syntax: %s", s) 850 } 851 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 862 } 863 } 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 870 } 871 return false, f.failf("flag provided but not defined: -%s", name) 872 } 873 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) 878 } 879 } else { 880 if err := fv.Set("true"); err != nil { 881 return false, f.failf("invalid boolean flag %s: %v", name, err) 882 } 883 } 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:] 890 } 891 if !hasValue { 892 return false, f.failf("flag needs an argument: -%s", name) 893 } 894 if err := flag.Value.Set(value); err != nil { 895 return false, f.failf("invalid value %q for flag -%s: %v", value, name, err) 896 } 897 } 898 if f.actual == nil { 899 f.actual = make(map[string]*Flag) 900 } 901 f.actual[name] = flag 902 return true, nil 903 } 904 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 916 } 917 if err == nil { 918 break 919 } 920 switch f.errorHandling { 921 case ContinueOnError: 922 return err 923 case ExitOnError: 924 os.Exit(2) 925 case PanicOnError: 926 panic(err) 927 } 928 } 929 return nil 930 } 931 932 // Parsed reports whether f.Parse has been called. 933 func (f *FlagSet) Parsed() bool { 934 return f.parsed 935 } 936 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:]) 942 } 943 944 // Parsed reports whether the command-line flags have been parsed. 945 func Parsed() bool { 946 return CommandLine.Parsed() 947 } 948 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) 953 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 960 } 961 962 func commandLineUsage() { 963 Usage() 964 } 965 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, 972 } 973 f.Usage = f.defaultUsage 974 return f 975 } 976 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 983 }