mirror of
https://github.com/golang/go
synced 2024-11-22 02:44:39 -07:00
flag: make zero FlagSet useful
This makes it possible to use a FlagSet as a field in a larger struct. R=golang-dev, r CC=golang-dev https://golang.org/cl/5036041
This commit is contained in:
parent
bb0c8b3b66
commit
1505cae05d
@ -286,6 +286,9 @@ func (f *FlagSet) Set(name, value string) bool {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if f.actual == nil {
|
||||||
|
f.actual = make(map[string]*Flag)
|
||||||
|
}
|
||||||
f.actual[name] = flag
|
f.actual[name] = flag
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -559,6 +562,9 @@ func (f *FlagSet) Var(value Value, name string, usage string) {
|
|||||||
fmt.Fprintf(os.Stderr, "%s flag redefined: %s\n", f.name, name)
|
fmt.Fprintf(os.Stderr, "%s flag redefined: %s\n", f.name, name)
|
||||||
panic("flag redefinition") // Happens only if flags are declared with identical names
|
panic("flag redefinition") // Happens only if flags are declared with identical names
|
||||||
}
|
}
|
||||||
|
if f.formal == nil {
|
||||||
|
f.formal = make(map[string]*Flag)
|
||||||
|
}
|
||||||
f.formal[name] = flag
|
f.formal[name] = flag
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -586,6 +592,8 @@ func (f *FlagSet) failf(format string, a ...interface{}) os.Error {
|
|||||||
func (f *FlagSet) usage() {
|
func (f *FlagSet) usage() {
|
||||||
if f == commandLine {
|
if f == commandLine {
|
||||||
Usage()
|
Usage()
|
||||||
|
} else if f.Usage == nil {
|
||||||
|
defaultUsage(f)
|
||||||
} else {
|
} else {
|
||||||
f.Usage()
|
f.Usage()
|
||||||
}
|
}
|
||||||
@ -657,6 +665,9 @@ func (f *FlagSet) parseOne() (bool, os.Error) {
|
|||||||
return false, f.failf("invalid value %q for flag: -%s", value, name)
|
return false, f.failf("invalid value %q for flag: -%s", value, name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if f.actual == nil {
|
||||||
|
f.actual = make(map[string]*Flag)
|
||||||
|
}
|
||||||
f.actual[name] = flag
|
f.actual[name] = flag
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
@ -713,10 +724,15 @@ var commandLine = NewFlagSet(os.Args[0], ExitOnError)
|
|||||||
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
|
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
|
||||||
f := &FlagSet{
|
f := &FlagSet{
|
||||||
name: name,
|
name: name,
|
||||||
actual: make(map[string]*Flag),
|
|
||||||
formal: make(map[string]*Flag),
|
|
||||||
errorHandling: errorHandling,
|
errorHandling: errorHandling,
|
||||||
}
|
}
|
||||||
f.Usage = func() { defaultUsage(f) }
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init sets the name and error handling property for a flag set.
|
||||||
|
// By default, the zero FlagSet uses an empty name and the
|
||||||
|
// ContinueOnError error handling policy.
|
||||||
|
func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
|
||||||
|
f.name = name
|
||||||
|
f.errorHandling = errorHandling
|
||||||
|
}
|
||||||
|
@ -180,7 +180,8 @@ func (f *flagVar) Set(value string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestUserDefined(t *testing.T) {
|
func TestUserDefined(t *testing.T) {
|
||||||
flags := NewFlagSet("test", ContinueOnError)
|
var flags FlagSet
|
||||||
|
flags.Init("test", ContinueOnError)
|
||||||
var v flagVar
|
var v flagVar
|
||||||
flags.Var(&v, "v", "usage")
|
flags.Var(&v, "v", "usage")
|
||||||
if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil {
|
if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user