diff options
Diffstat (limited to 'flag.go')
| -rw-r--r-- | flag.go | 74 |
1 files changed, 36 insertions, 38 deletions
@@ -120,9 +120,9 @@ const ( PanicOnError ) -// normalizedName is a flag name that has been normalized according to rules +// NormalizedName is a flag name that has been normalized according to rules // for the FlagSet (e.g. making '-' and '_' equivalent). -type normalizedName string +type NormalizedName string // A FlagSet represents a set of defined flags. type FlagSet struct { @@ -131,17 +131,17 @@ type FlagSet struct { // a custom error handler. Usage func() - name string - parsed bool - actual map[normalizedName]*Flag - formal map[normalizedName]*Flag - shorthands map[byte]*Flag - args []string // arguments after flags - exitOnError bool // does the program exit if there's an error? - errorHandling ErrorHandling - output io.Writer // nil means stderr; use out() accessor - interspersed bool // allow interspersed option/non-option args - wordSeparators []string + name string + parsed bool + actual map[NormalizedName]*Flag + formal map[NormalizedName]*Flag + shorthands map[byte]*Flag + args []string // arguments after flags + exitOnError bool // does the program exit if there's an error? + errorHandling ErrorHandling + output io.Writer // nil means stderr; use out() accessor + interspersed bool // allow interspersed option/non-option args + normalizeNameFunc func(f *FlagSet, name string) NormalizedName } // A Flag represents the state of a flag. @@ -165,7 +165,7 @@ type Value interface { } // sortFlags returns the flags as a slice in lexicographical sorted order. -func sortFlags(flags map[normalizedName]*Flag) []*Flag { +func sortFlags(flags map[NormalizedName]*Flag) []*Flag { list := make(sort.StringSlice, len(flags)) i := 0 for k := range flags { @@ -175,18 +175,29 @@ func sortFlags(flags map[normalizedName]*Flag) []*Flag { list.Sort() result := make([]*Flag, len(list)) for i, name := range list { - result[i] = flags[normalizedName(name)] + result[i] = flags[NormalizedName(name)] } return result } -func (f *FlagSet) normalizeFlagName(name string) normalizedName { - result := name - for _, sep := range f.wordSeparators { - result = strings.Replace(result, sep, "-", -1) +func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) { + f.normalizeNameFunc = n + for k, v := range f.formal { + delete(f.formal, k) + f.formal[f.normalizeFlagName(string(k))] = v } - // Type convert to indicate normalization has been done. - return normalizedName(result) +} + +func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) NormalizedName { + if f.normalizeNameFunc != nil { + return f.normalizeNameFunc + } + return func(f *FlagSet, name string) NormalizedName { return NormalizedName(name) } +} + +func (f *FlagSet) normalizeFlagName(name string) NormalizedName { + n := f.GetNormalizeFunc() + return n(f, name) } func (f *FlagSet) out() io.Writer { @@ -240,7 +251,7 @@ func (f *FlagSet) Lookup(name string) *Flag { } // lookup returns the Flag structure of the named flag, returning nil if none exists. -func (f *FlagSet) lookup(name normalizedName) *Flag { +func (f *FlagSet) lookup(name NormalizedName) *Flag { return f.formal[name] } @@ -272,7 +283,7 @@ func (f *FlagSet) Set(name, value string) error { return err } if f.actual == nil { - f.actual = make(map[normalizedName]*Flag) + f.actual = make(map[NormalizedName]*Flag) } f.actual[normalName] = flag flag.Changed = true @@ -417,7 +428,7 @@ func (f *FlagSet) AddFlag(flag *Flag) { panic(msg) // Happens only if flags are declared with identical names } if f.formal == nil { - f.formal = make(map[normalizedName]*Flag) + f.formal = make(map[NormalizedName]*Flag) } f.formal[f.normalizeFlagName(flag.Name)] = flag @@ -482,7 +493,7 @@ func (f *FlagSet) setFlag(flag *Flag, value string, origArg string) error { } // mark as visited for Visit() if f.actual == nil { - f.actual = make(map[normalizedName]*Flag) + f.actual = make(map[NormalizedName]*Flag) } f.actual[f.normalizeFlagName(flag.Name)] = flag flag.Changed = true @@ -648,19 +659,6 @@ func SetInterspersed(interspersed bool) { CommandLine.SetInterspersed(interspersed) } -// SetWordSeparators sets a list of strings to be considerered as word -// separators and normalized for the pruposes of lookups. For example, if this -// is set to {"-", "_", "."} then --foo_bar, --foo-bar, and --foo.bar are -// considered equivalent flags. This must be called before flags are parsed, -// and may only be called once. -func (f *FlagSet) SetWordSeparators(separators []string) { - f.wordSeparators = separators - for k, v := range f.formal { - delete(f.formal, k) - f.formal[f.normalizeFlagName(string(k))] = v - } -} - // Parsed returns true if the command-line flags have been parsed. func Parsed() bool { return CommandLine.Parsed() |
