use interface to represent arguments with format --flag=value
diff --git a/parser.go b/parser.go
index 03ccb76..d342561 100644
--- a/parser.go
+++ b/parser.go
@@ -26,14 +26,35 @@
// UnknownOptionsHandler is a function which gets called when the parser
// encounters an unknown option. The function receives the unknown option
- // name, its value if specified with '=', and the remaining command line arguments.
+ // name, an Argument which specifies its value if set with '=', and the
+ // remaining command line arguments.
// It should return a new list of remaining arguments to continue parsing,
// or an error to indicate a parse failure.
- UnknownOptionHandler func(option string, val *string, args []string) ([]string, error)
+ UnknownOptionHandler func(option string, arg Argument, args []string) ([]string, error)
internalError error
}
+// Argument represents the value of an option that was passed on the command
+// line in the form "--flagName=value".
+type Argument interface {
+ // String returns the option's value as a string, and a boolean indicating
+ // if the option was present.
+ String() (string, bool)
+}
+
+type strArgument struct {
+ value *string
+}
+
+func (s strArgument) String() (string, bool) {
+ if s.value == nil {
+ return "", false
+ }
+
+ return *s.value, true
+}
+
// Options provides parser options that change the behavior of the option
// parser.
type Options uint
@@ -219,7 +240,7 @@
if ignoreUnknown {
s.addArgs(arg)
} else if p.UnknownOptionHandler != nil {
- modifiedArgs, err := p.UnknownOptionHandler(optname, argument, s.args)
+ modifiedArgs, err := p.UnknownOptionHandler(optname, strArgument{argument}, s.args)
if err != nil {
s.err = err
diff --git a/parser_test.go b/parser_test.go
index 325bc35..020e575 100644
--- a/parser_test.go
+++ b/parser_test.go
@@ -372,10 +372,10 @@
var unknownFlag3 string
// Set up a callback to intercept unknown options during parsing
- p.UnknownOptionHandler = func(option string, argument *string, args []string) ([]string, error) {
+ p.UnknownOptionHandler = func(option string, arg Argument, args []string) ([]string, error) {
if option == "unknownFlag1" {
- if argument != nil {
- unknownFlag1 = *argument
+ if argValue, ok := arg.String(); ok {
+ unknownFlag1 = argValue
return args, nil
}
// consume a value from remaining args list
@@ -386,8 +386,8 @@
unknownFlag2 = true
return args, nil
} else if option == "unknownFlag3" {
- if argument != nil {
- unknownFlag3 = *argument
+ if argValue, ok := arg.String(); ok {
+ unknownFlag3 = argValue
return args, nil
}
// consume a value from remaining args list