From bc2f505c2d3de50be4e8bf56671f960b71c725c8 Mon Sep 17 00:00:00 2001 From: "jhughes1153@aol.com" Date: Sat, 16 May 2020 17:47:43 -0400 Subject: [PATCH 1/2] added ability to use equals from the cli --- argparse_test.go | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ argument.go | 10 ++++++ command.go | 21 +++++++++++ 3 files changed, 121 insertions(+) diff --git a/argparse_test.go b/argparse_test.go index fcbd96a..b83fa9b 100644 --- a/argparse_test.go +++ b/argparse_test.go @@ -194,6 +194,96 @@ func TestFlagSimple2(t *testing.T) { } } +func TestLongFlagEqualChar(t *testing.T) { + testArgs := []string{"progname", "--flag1=test1", "--flag2=test2", "--flag3", "test3"} + + p := NewParser("", "description") + flag1 := p.String("", "flag1", nil) + flag2 := p.String("", "flag2", nil) + flag3 := p.String("", "flag3", nil) + + err := p.Parse(testArgs) + if err != nil { + t.Errorf("Test %s failed with error: %s", t.Name(), err.Error()) + return + } + + if flag1 == nil { + t.Errorf("Test %s failed with flag1 being nil pointer", t.Name()) + return + } + + if flag2 == nil { + t.Errorf("Test %s failed with flag2 being nil pointer", t.Name()) + return + } + + if flag3 == nil { + t.Errorf("Test %s failed with flag3 being nil pointer", t.Name()) + return + } + + if *flag1 != "test1" { + t.Errorf("Test %s failed with flag1 being false", t.Name()) + return + } + + if *flag2 != "test2" { + t.Errorf("Test %s failed with flag2 being true", t.Name()) + return + } + + if *flag3 != "test3" { + t.Errorf("Test %s failed with flag3 being true", t.Name()) + return + } +} + +func TestShortFlagEqualChar(t *testing.T) { + testArgs := []string{"progname", "-a=test1", "-b=test2", "-c", "test3"} + + p := NewParser("", "description") + flag1 := p.String("a", "flag1", nil) + flag2 := p.String("b", "flag2", nil) + flag3 := p.String("c", "flag3", nil) + + err := p.Parse(testArgs) + if err != nil { + t.Errorf("Test %s failed with error: %s", t.Name(), err.Error()) + return + } + + if flag1 == nil { + t.Errorf("Test %s failed with flag1 being nil pointer", t.Name()) + return + } + + if flag2 == nil { + t.Errorf("Test %s failed with flag2 being nil pointer", t.Name()) + return + } + + if flag3 == nil { + t.Errorf("Test %s failed with flag3 being nil pointer", t.Name()) + return + } + + if *flag1 != "test1" { + t.Errorf("Test %s failed with flag1 being false", t.Name()) + return + } + + if *flag2 != "test2" { + t.Errorf("Test %s failed with flag2 being true", t.Name()) + return + } + + if *flag3 != "test3" { + t.Errorf("Test %s failed with flag3 being true", t.Name()) + return + } +} + func TestFlagMultiShorthandWithParam1(t *testing.T) { testArgs := []string{"progname", "-ab", "10", "-c", "-de", "11", "--ee", "12"} diff --git a/argument.go b/argument.go index 24ab16c..9b5aed3 100644 --- a/argument.go +++ b/argument.go @@ -20,6 +20,7 @@ type arg struct { filePerm os.FileMode // File permissions to set a file selector *[]string // Used in Selector type to allow to choose only one from list of options parent *Command // Used to get access to specific Command + eqChar bool // This is used if the command is passed in with an equals char as a seperator } // Arg interface provides exporting of arg structure, while exposing it @@ -67,6 +68,7 @@ func (o *arg) checkLongName(argument string) int { func (o *arg) checkShortName(argument string) (int, error) { // Check for short name only if not empty if o.sname != "" { + // If argument begins with "-" and next is not "-" then it is a short name if len(argument) > 1 && strings.HasPrefix(argument, "-") && argument[1] != '-' { count := strings.Count(argument[1:], o.sname) @@ -112,6 +114,11 @@ func (o *arg) reduceLongName(position int, args *[]string) { if o.lname != "" { // If argument begins with "--" and next is not "-" then it is a long name if len(argument) > 2 && strings.HasPrefix(argument, "--") && argument[2] != '-' { + if o.eqChar { + splitInd := strings.LastIndex(argument, "=") + equalArg := []string{argument[:splitInd], argument[splitInd+1:]} + argument = equalArg[0] + } if argument[2:] == o.lname { for i := position; i < position+o.size; i++ { (*args)[i] = "" @@ -134,6 +141,9 @@ func (o *arg) reduceShortName(position int, args *[]string) { if (*args)[position] == "-" { (*args)[position] = "" } + if o.eqChar { + (*args)[position] = "" + } } // For all other types it must be separate argument } else { diff --git a/command.go b/command.go index da8d7ba..1de4947 100644 --- a/command.go +++ b/command.go @@ -2,6 +2,7 @@ package argparse import ( "fmt" + "strings" ) func (o *Command) help(sname, lname string) { @@ -80,6 +81,26 @@ func (o *Command) parseArguments(args *[]string) error { if arg == "" { continue } + if strings.Contains(arg, "=") { + splitInd := strings.LastIndex(arg, "=") + equalArg := []string{arg[:splitInd], arg[splitInd+1:]} + if cnt, err := oarg.check(equalArg[0]); err != nil { + return err + } else if cnt > 0 { + if len(equalArg) < 2 { + return fmt.Errorf("not enough arguments for %s", oarg.name()) + } + oarg.eqChar = true + oarg.size = 1 + currArg := []string{equalArg[1]} + err := oarg.parse(currArg, cnt) + if err != nil { + return err + } + oarg.reduce(j, args) + continue + } + } if cnt, err := oarg.check(arg); err != nil { return err } else if cnt > 0 { From f0855e2c9fd2c89b6b2b6f5bcbfac544e5aa48be Mon Sep 17 00:00:00 2001 From: "jhughes1153@aol.com" Date: Sun, 17 May 2020 12:38:28 -0400 Subject: [PATCH 2/2] added more tests --- argparse_test.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/argparse_test.go b/argparse_test.go index b83fa9b..cd0b4ea 100644 --- a/argparse_test.go +++ b/argparse_test.go @@ -195,12 +195,14 @@ func TestFlagSimple2(t *testing.T) { } func TestLongFlagEqualChar(t *testing.T) { - testArgs := []string{"progname", "--flag1=test1", "--flag2=test2", "--flag3", "test3"} + testArgs := []string{"progname", "--flag1=test1", "--flag2=test2", "--flag3", "test3", "--flag4=a=test4", "--flag5=a", "test5"} p := NewParser("", "description") flag1 := p.String("", "flag1", nil) flag2 := p.String("", "flag2", nil) flag3 := p.String("", "flag3", nil) + flag4 := p.String("", "flag4=a", nil) + flag5 := p.String("", "flag5=a", nil) err := p.Parse(testArgs) if err != nil { @@ -223,6 +225,16 @@ func TestLongFlagEqualChar(t *testing.T) { return } + if flag4 == nil { + t.Errorf("Test %s failed with flag4 being nil pointer", t.Name()) + return + } + + if flag5 == nil { + t.Errorf("Test %s failed with flag5 being nil pointer", t.Name()) + return + } + if *flag1 != "test1" { t.Errorf("Test %s failed with flag1 being false", t.Name()) return @@ -237,6 +249,16 @@ func TestLongFlagEqualChar(t *testing.T) { t.Errorf("Test %s failed with flag3 being true", t.Name()) return } + + if *flag4 != "test4" { + t.Errorf("Test %s failed with flag3 being true", t.Name()) + return + } + + if *flag5 != "test5" { + t.Errorf("Test %s failed with flag3 being true", t.Name()) + return + } } func TestShortFlagEqualChar(t *testing.T) {