aboutsummaryrefslogtreecommitdiff
path: root/flag.go
diff options
context:
space:
mode:
authorEric Paris <[email protected]>2015-04-28 21:05:37 -0500
committerEric Paris <[email protected]>2015-04-28 21:05:37 -0500
commitd4ebabf889f7b016ffcb5f74c350e1e5424b2094 (patch)
tree8dbac67aadff5ae441cbbe86aae9e9134d374f5d /flag.go
parent8e80315abba69b8bf128c1a924ddff2b37f28bff (diff)
parent0474b1ab2b4623e577250951b42fae29a1984b5f (diff)
Merge pull request #15 from eparis/generic-flag-normalization-thockin
Generic flag normalization
Diffstat (limited to 'flag.go')
-rw-r--r--flag.go74
1 files changed, 36 insertions, 38 deletions
diff --git a/flag.go b/flag.go
index ac14b81..55594df 100644
--- a/flag.go
+++ b/flag.go
@@ -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()