From 2e481152920c23cb939e7224aac245973a00ee95 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Wed, 19 Dec 2012 20:36:31 -1000 Subject: Add support for non-interspersed option/non-option args. --- flag.go | 33 ++++++++++++++++++++++++--------- flag_test.go | 15 +++++++++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/flag.go b/flag.go index 06edf20..4f6f93f 100644 --- a/flag.go +++ b/flag.go @@ -260,15 +260,16 @@ type FlagSet struct { // a custom error handler. Usage func() - name string - parsed bool - actual map[string]*Flag - formal map[string]*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 + name string + parsed bool + actual map[string]*Flag + formal map[string]*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 + noInterspersed bool // do not allow interspersed option/non-option args } // A Flag represents the state of a flag. @@ -919,6 +920,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.noInterspersed { + f.args = append(f.args, s) + f.args = append(f.args, args...) + return nil + } f.args = append(f.args, s) continue } @@ -1022,6 +1028,11 @@ func Parse() { commandLine.Parse(os.Args[1:]) } +// Do not support interspersed option/non-option arguments. +func NoInterspersed() { + commandLine.NoInterspersed() +} + // Parsed returns true if the command-line flags have been parsed. func Parsed() bool { return commandLine.Parsed() @@ -1040,6 +1051,10 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { return f } +func (f *FlagSet) NoInterspersed() { + f.noInterspersed = true +} + // 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..635f431 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.NoInterspersed() + 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") + } +} -- cgit v1.2.3 From 7c5bc8fc09f880184cd52a292e0c31931b5eb847 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Thu, 20 Dec 2012 06:39:26 -1000 Subject: Set interspersed behaviour via a setter. --- flag.go | 34 ++++++++++++++++++---------------- flag_test.go | 2 +- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/flag.go b/flag.go index 4f6f93f..7cc2755 100644 --- a/flag.go +++ b/flag.go @@ -260,16 +260,16 @@ type FlagSet struct { // a custom error handler. Usage func() - name string - parsed bool - actual map[string]*Flag - formal map[string]*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 - noInterspersed bool // do not allow interspersed option/non-option args + name string + parsed bool + actual map[string]*Flag + formal map[string]*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 // do not allow interspersed option/non-option args } // A Flag represents the state of a flag. @@ -920,7 +920,7 @@ func (f *FlagSet) parseArgs(args []string) error { s := args[0] args = args[1:] if len(s) == 0 || s[0] != '-' || len(s) == 1 { - if f.noInterspersed { + if !f.interspersed { f.args = append(f.args, s) f.args = append(f.args, args...) return nil @@ -1028,9 +1028,9 @@ func Parse() { commandLine.Parse(os.Args[1:]) } -// Do not support interspersed option/non-option arguments. -func NoInterspersed() { - commandLine.NoInterspersed() +// 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. @@ -1047,12 +1047,14 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { f := &FlagSet{ name: name, errorHandling: errorHandling, + interspersed: true, } return f } -func (f *FlagSet) NoInterspersed() { - f.noInterspersed = true +// 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. diff --git a/flag_test.go b/flag_test.go index 635f431..42d5483 100644 --- a/flag_test.go +++ b/flag_test.go @@ -338,7 +338,7 @@ func TestHelp(t *testing.T) { func TestNoInterspersed(t *testing.T) { f := NewFlagSet("test", ContinueOnError) - f.NoInterspersed() + f.SetInterspersed(false) f.Bool("true", true, "always true") f.Bool("false", false, "always false") err := f.Parse([]string{"--true", "break", "--false"}) -- cgit v1.2.3 From 6c61b06dffa80d2a272c8c2a79448954d9893c74 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Thu, 20 Dec 2012 08:37:35 -1000 Subject: Fix comment. --- flag.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flag.go b/flag.go index 7cc2755..8f5e8e7 100644 --- a/flag.go +++ b/flag.go @@ -269,7 +269,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 // do not allow interspersed option/non-option args + interspersed bool // allow interspersed option/non-option args } // A Flag represents the state of a flag. -- cgit v1.2.3