Skip to content

Commit 7061ca3

Browse files
authored
Merge pull request akamensky#68 from jhughes1153/master
added ability to use equals from the cli
2 parents 82bef92 + 7f10e1d commit 7061ca3

File tree

3 files changed

+191
-0
lines changed

3 files changed

+191
-0
lines changed

argparse_test.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,118 @@ func TestFlagSimple2(t *testing.T) {
194194
}
195195
}
196196

197+
func TestLongFlagEqualChar(t *testing.T) {
198+
testArgs := []string{"progname", "--flag1=test1", "--flag2=2", "--flag3", "test3", "--flag4=a=test4", "--flag5=a"}
199+
200+
p := NewParser("", "description")
201+
flag1 := p.String("", "flag1", nil)
202+
flag2 := p.Int("", "flag2", nil)
203+
flag3 := p.String("", "flag3", nil)
204+
flag4 := p.String("", "flag4=a", nil)
205+
flag5 := p.Flag("", "flag5=a", nil)
206+
207+
err := p.Parse(testArgs)
208+
if err != nil {
209+
t.Errorf("Test %s failed with error: %s", t.Name(), err.Error())
210+
return
211+
}
212+
213+
if flag1 == nil {
214+
t.Errorf("Test %s failed with flag1 being nil pointer", t.Name())
215+
return
216+
}
217+
218+
if flag2 == nil {
219+
t.Errorf("Test %s failed with flag2 being nil pointer", t.Name())
220+
return
221+
}
222+
223+
if flag3 == nil {
224+
t.Errorf("Test %s failed with flag3 being nil pointer", t.Name())
225+
return
226+
}
227+
228+
if flag4 == nil {
229+
t.Errorf("Test %s failed with flag4 being nil pointer", t.Name())
230+
return
231+
}
232+
233+
if flag5 == nil {
234+
t.Errorf("Test %s failed with flag5 being nil pointer", t.Name())
235+
return
236+
}
237+
238+
if *flag1 != "test1" {
239+
t.Errorf("Test %s failed with flag1 being false", t.Name())
240+
return
241+
}
242+
243+
if *flag2 != 2 {
244+
t.Errorf("Test %s failed with flag2 being true", t.Name())
245+
return
246+
}
247+
248+
if *flag3 != "test3" {
249+
t.Errorf("Test %s failed with flag3 being true", t.Name())
250+
return
251+
}
252+
253+
if *flag4 != "test4" {
254+
t.Errorf("Test %s failed with flag3 being true", t.Name())
255+
return
256+
}
257+
258+
if *flag5 != true {
259+
t.Errorf("Test %s failed with flag3 being true", t.Name())
260+
return
261+
}
262+
}
263+
264+
func TestShortFlagEqualChar(t *testing.T) {
265+
testArgs := []string{"progname", "-a=test1", "-b=2", "-c", "test3"}
266+
267+
p := NewParser("", "description")
268+
flag1 := p.String("a", "flag1", nil)
269+
flag2 := p.Int("b", "flag2", nil)
270+
flag3 := p.String("c", "flag3", nil)
271+
272+
err := p.Parse(testArgs)
273+
if err != nil {
274+
t.Errorf("Test %s failed with error: %s", t.Name(), err.Error())
275+
return
276+
}
277+
278+
if flag1 == nil {
279+
t.Errorf("Test %s failed with flag1 being nil pointer", t.Name())
280+
return
281+
}
282+
283+
if flag2 == nil {
284+
t.Errorf("Test %s failed with flag2 being nil pointer", t.Name())
285+
return
286+
}
287+
288+
if flag3 == nil {
289+
t.Errorf("Test %s failed with flag3 being nil pointer", t.Name())
290+
return
291+
}
292+
293+
if *flag1 != "test1" {
294+
t.Errorf("Test %s failed with flag1 being false", t.Name())
295+
return
296+
}
297+
298+
if *flag2 != 2 {
299+
t.Errorf("Test %s failed with flag2 being true", t.Name())
300+
return
301+
}
302+
303+
if *flag3 != "test3" {
304+
t.Errorf("Test %s failed with flag3 being true", t.Name())
305+
return
306+
}
307+
}
308+
197309
func TestFlagMultiShorthandWithParam1(t *testing.T) {
198310
testArgs := []string{"progname", "-ab", "10", "-c", "-de", "11", "--ee", "12"}
199311

@@ -744,6 +856,54 @@ func TestIntFailSimple1(t *testing.T) {
744856
}
745857
}
746858

859+
func TestEqualIntFailSimple1(t *testing.T) {
860+
testArgs := []string{"progname", "--flag-arg1=string"}
861+
862+
p := NewParser("", "description")
863+
i1 := p.Int("f", "flag-arg1", nil)
864+
865+
err := p.Parse(testArgs)
866+
errStr := "[-f|--flag-arg1] bad integer value [string]"
867+
if err == nil || err.Error() != errStr {
868+
t.Errorf("Test %s expected [%s], got [%+v]", t.Name(), errStr, err)
869+
return
870+
}
871+
872+
if i1 == nil {
873+
t.Errorf("Test %s failed with flag1 being nil pointer", t.Name())
874+
return
875+
}
876+
877+
if *i1 != 0 {
878+
t.Errorf("Test %s failed. Want: [0], got: [%d]", t.Name(), *i1)
879+
return
880+
}
881+
}
882+
883+
func TestEqualNoValFailSimple(t *testing.T) {
884+
testArgs := []string{"progname", "--flag-arg1="}
885+
886+
p := NewParser("", "description")
887+
i1 := p.Int("f", "flag-arg1", nil)
888+
889+
err := p.Parse(testArgs)
890+
errStr := "not enough arguments for -f|--flag-arg1"
891+
if err == nil || err.Error() != errStr {
892+
t.Errorf("Test %s expected [%s], got [%+v]", t.Name(), errStr, err)
893+
return
894+
}
895+
896+
if i1 == nil {
897+
t.Errorf("Test %s failed with flag1 being nil pointer", t.Name())
898+
return
899+
}
900+
901+
if *i1 != 0 {
902+
t.Errorf("Test %s failed. Want: [0], got: [%d]", t.Name(), *i1)
903+
return
904+
}
905+
}
906+
747907
func TestFileAddArgumentFail(t *testing.T) {
748908
type testCase struct {
749909
testName, shortArg, longArg, failureMessage string

argument.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type arg struct {
2020
filePerm os.FileMode // File permissions to set a file
2121
selector *[]string // Used in Selector type to allow to choose only one from list of options
2222
parent *Command // Used to get access to specific Command
23+
eqChar bool // This is used if the command is passed in with an equals char as a seperator
2324
}
2425

2526
// Arg interface provides exporting of arg structure, while exposing it
@@ -67,6 +68,7 @@ func (o *arg) checkLongName(argument string) int {
6768
func (o *arg) checkShortName(argument string) (int, error) {
6869
// Check for short name only if not empty
6970
if o.sname != "" {
71+
7072
// If argument begins with "-" and next is not "-" then it is a short name
7173
if len(argument) > 1 && strings.HasPrefix(argument, "-") && argument[1] != '-' {
7274
count := strings.Count(argument[1:], o.sname)
@@ -112,6 +114,11 @@ func (o *arg) reduceLongName(position int, args *[]string) {
112114
if o.lname != "" {
113115
// If argument begins with "--" and next is not "-" then it is a long name
114116
if len(argument) > 2 && strings.HasPrefix(argument, "--") && argument[2] != '-' {
117+
if o.eqChar {
118+
splitInd := strings.LastIndex(argument, "=")
119+
equalArg := []string{argument[:splitInd], argument[splitInd+1:]}
120+
argument = equalArg[0]
121+
}
115122
if argument[2:] == o.lname {
116123
for i := position; i < position+o.size; i++ {
117124
(*args)[i] = ""
@@ -134,6 +141,9 @@ func (o *arg) reduceShortName(position int, args *[]string) {
134141
if (*args)[position] == "-" {
135142
(*args)[position] = ""
136143
}
144+
if o.eqChar {
145+
(*args)[position] = ""
146+
}
137147
}
138148
// For all other types it must be separate argument
139149
} else {

command.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package argparse
22

33
import (
44
"fmt"
5+
"strings"
56
)
67

78
func (o *Command) help(sname, lname string) {
@@ -80,6 +81,26 @@ func (o *Command) parseArguments(args *[]string) error {
8081
if arg == "" {
8182
continue
8283
}
84+
if strings.Contains(arg, "=") {
85+
splitInd := strings.LastIndex(arg, "=")
86+
equalArg := []string{arg[:splitInd], arg[splitInd+1:]}
87+
if cnt, err := oarg.check(equalArg[0]); err != nil {
88+
return err
89+
} else if cnt > 0 {
90+
if equalArg[1] == "" {
91+
return fmt.Errorf("not enough arguments for %s", oarg.name())
92+
}
93+
oarg.eqChar = true
94+
oarg.size = 1
95+
currArg := []string{equalArg[1]}
96+
err := oarg.parse(currArg, cnt)
97+
if err != nil {
98+
return err
99+
}
100+
oarg.reduce(j, args)
101+
continue
102+
}
103+
}
83104
if cnt, err := oarg.check(arg); err != nil {
84105
return err
85106
} else if cnt > 0 {

0 commit comments

Comments
 (0)