aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ogier <[email protected]>2012-12-20 10:45:41 -0800
committerAlex Ogier <[email protected]>2012-12-20 10:45:41 -0800
commita7be1c8beca28c928f9bd874b97e32fb3b02baef (patch)
treec12c281ae78242733e933df99ce43bdb8e010ebc
parentfc678a46fb7fcef2879c7361da75cd77ec172444 (diff)
parent6c61b06dffa80d2a272c8c2a79448954d9893c74 (diff)
Merge pull request #2 from alecthomas/master
Add ability to disable interspersed option support.
-rw-r--r--flag.go17
-rw-r--r--flag_test.go15
2 files changed, 32 insertions, 0 deletions
diff --git a/flag.go b/flag.go
index 0154001..743e011 100644
--- a/flag.go
+++ b/flag.go
@@ -271,6 +271,7 @@ type FlagSet struct {
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
}
// A Flag represents the state of a flag.
@@ -927,6 +928,11 @@ func (f *FlagSet) parseArgs(args []string) error {
s := args[0]
args = args[1:]
if len(s) == 0 || s[0] != '-' || len(s) == 1 {
+ if !f.interspersed {
+ f.args = append(f.args, s)
+ f.args = append(f.args, args...)
+ return nil
+ }
f.args = append(f.args, s)
continue
}
@@ -1030,6 +1036,11 @@ func Parse() {
commandLine.Parse(os.Args[1:])
}
+// Whether to support interspersed option/non-option arguments.
+func SetInterspersed(interspersed bool) {
+ commandLine.SetInterspersed(interspersed)
+}
+
// Parsed returns true if the command-line flags have been parsed.
func Parsed() bool {
return commandLine.Parsed()
@@ -1044,10 +1055,16 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
f := &FlagSet{
name: name,
errorHandling: errorHandling,
+ interspersed: true,
}
return f
}
+// Whether to support interspersed option/non-option arguments.
+func (f *FlagSet) SetInterspersed(interspersed bool) {
+ f.interspersed = interspersed
+}
+
// 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.
diff --git a/flag_test.go b/flag_test.go
index 9caa8c4..42d5483 100644
--- a/flag_test.go
+++ b/flag_test.go
@@ -335,3 +335,18 @@ func TestHelp(t *testing.T) {
t.Fatal("help was called; should not have been for defined help flag")
}
}
+
+func TestNoInterspersed(t *testing.T) {
+ f := NewFlagSet("test", ContinueOnError)
+ f.SetInterspersed(false)
+ f.Bool("true", true, "always true")
+ f.Bool("false", false, "always false")
+ err := f.Parse([]string{"--true", "break", "--false"})
+ if err != nil {
+ t.Fatal("expected no error; got ", err)
+ }
+ args := f.Args()
+ if len(args) != 2 || args[0] != "break" || args[1] != "--false" {
+ t.Fatal("expected interspersed options/non-options to fail")
+ }
+}