Skip to content

Commit 1d46e0e

Browse files
authored
new: added FindFirstArg function (#33)
1 parent 931b625 commit 1d46e0e

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

find.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (C) 2023 Takayuki Sato. All Rights Reserved.
2+
// This program is free software under MIT License.
3+
// See the file LICENSE in this distribution for more details.
4+
5+
package cliargs
6+
7+
import (
8+
"strings"
9+
)
10+
11+
// FindFirstArg is a function which returns an index, a name, a existent flag
12+
// of first non option-format element in a specified string array.
13+
// If non option-format element is found, a existent flag is true, but if
14+
// the element is not found, the flag is false.
15+
func FindFirstArg(osArgs []string) (index int, arg string, exists bool) {
16+
isNonOpt := false
17+
if len(osArgs) > 0 {
18+
for i, a := range osArgs[1:] {
19+
if isNonOpt {
20+
return i + 1, a, true
21+
} else if a == "--" {
22+
isNonOpt = true
23+
continue
24+
} else if !strings.HasPrefix(a, "-") {
25+
return i + 1, a, true
26+
}
27+
}
28+
}
29+
return -1, "", false
30+
}

find_test.go

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package cliargs_test
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"github.com/sttk-go/cliargs"
6+
"testing"
7+
)
8+
9+
func TestFindFirstArg_findAtFirstIndex(t *testing.T) {
10+
osArgs := []string{"app", "foo-bar", "-a", "--baz", "--bcd"}
11+
12+
i, arg, exists := cliargs.FindFirstArg(osArgs)
13+
assert.Equal(t, i, 1)
14+
assert.Equal(t, arg, "foo-bar")
15+
assert.True(t, exists)
16+
}
17+
18+
func TestFindFirstArg_findAtMiddleIndex(t *testing.T) {
19+
osArgs := []string{"app", "--corge", "foo-bar", "-a", "--baz", "--bcd"}
20+
21+
i, arg, exists := cliargs.FindFirstArg(osArgs)
22+
assert.Equal(t, i, 2)
23+
assert.Equal(t, arg, "foo-bar")
24+
assert.True(t, exists)
25+
}
26+
27+
func TestFindFirstArg_findAtLastIndex(t *testing.T) {
28+
osArgs := []string{"app", "--corge", "--foo-bar", "-a", "baz"}
29+
30+
i, arg, exists := cliargs.FindFirstArg(osArgs)
31+
assert.Equal(t, i, 4)
32+
assert.Equal(t, arg, "baz")
33+
assert.True(t, exists)
34+
}
35+
36+
func TestFindFirstArg_returnFoundFirst(t *testing.T) {
37+
osArgs := []string{"app", "--corge", "foo-bar", "-a", "baz", "--bcd"}
38+
39+
i, arg, exists := cliargs.FindFirstArg(osArgs)
40+
assert.Equal(t, i, 2)
41+
assert.Equal(t, arg, "foo-bar")
42+
assert.True(t, exists)
43+
}
44+
45+
func TestFindFirstArg_notFound(t *testing.T) {
46+
osArgs := []string{"app", "--corge", "--foo-bar", "-a", "-baz", "--bcd"}
47+
48+
i, arg, exists := cliargs.FindFirstArg(osArgs)
49+
assert.Equal(t, i, -1)
50+
assert.Equal(t, arg, "")
51+
assert.False(t, exists)
52+
}
53+
54+
func TestFindFirstArg_supportDoubleHyphens(t *testing.T) {
55+
osArgs := []string{"app", "--", "--foo-bar", "-a", "-baz", "--bcd"}
56+
57+
i, arg, exists := cliargs.FindFirstArg(osArgs)
58+
assert.Equal(t, i, 2)
59+
assert.Equal(t, arg, "--foo-bar")
60+
assert.True(t, exists)
61+
}

0 commit comments

Comments
 (0)