Skip to content

Commit b37a58d

Browse files
committed
Add utility functions to access args
1 parent db65aa6 commit b37a58d

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed

v2/codetags/types.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,29 @@ type Tag struct {
4141
ValueType ValueType
4242
}
4343

44+
// PositionalArg returns the positional argument. If there is no positional
45+
// argument, it returns false.
46+
func (t Tag) PositionalArg() (Arg, bool) {
47+
if len(t.Args) == 0 || len(t.Args[0].Name) > 0 {
48+
return Arg{}, false
49+
}
50+
return t.Args[0], true
51+
}
52+
53+
// NamedArg returns the named argument. If o named argument is found, it returns
54+
// false. Always returns false for empty name; use PositionalArg instead.
55+
func (t Tag) NamedArg(name string) (Arg, bool) {
56+
if len(name) == 0 {
57+
return Arg{}, false
58+
}
59+
for _, arg := range t.Args {
60+
if arg.Name == name {
61+
return arg, true
62+
}
63+
}
64+
return Arg{}, false
65+
}
66+
4467
// String returns the canonical string representation of the tag.
4568
// All strings are represented in double quotes. Spacing is normalized.
4669
func (t Tag) String() string {

v2/codetags/types_test.go

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package codetags
1818

1919
import (
20+
"reflect"
2021
"testing"
2122
)
2223

@@ -197,3 +198,134 @@ func TestTypedTagString(t *testing.T) {
197198
})
198199
}
199200
}
201+
202+
func TestTagArgAccessors(t *testing.T) {
203+
strPtr := func(s string) *string { return &s }
204+
205+
tests := []struct {
206+
name string
207+
tag Tag
208+
argName *string
209+
wantPositional *Arg
210+
wantNamed *Arg
211+
found bool
212+
}{
213+
{
214+
name: "found positional arg",
215+
tag: Tag{
216+
Name: "tag",
217+
Args: []Arg{
218+
{Value: "value1", Type: ArgTypeInt},
219+
},
220+
},
221+
wantPositional: &Arg{Value: "value1", Type: ArgTypeInt},
222+
found: true,
223+
},
224+
{
225+
name: "not found positional arg, no args",
226+
tag: Tag{
227+
Name: "tag",
228+
Args: []Arg{},
229+
},
230+
found: false,
231+
},
232+
{
233+
name: "not found positional arg, only named args",
234+
tag: Tag{
235+
Name: "tag",
236+
Args: []Arg{
237+
{Name: "arg1", Value: "value1", Type: ArgTypeInt},
238+
{Name: "arg1", Value: "value2", Type: ArgTypeString},
239+
},
240+
},
241+
found: false,
242+
},
243+
244+
{
245+
name: "found named arg, first",
246+
tag: Tag{
247+
Name: "tag",
248+
Args: []Arg{
249+
{Name: "arg1", Value: "value1", Type: ArgTypeString},
250+
{Name: "arg2", Value: "value2", Type: ArgTypeString},
251+
{Name: "arg3", Value: "value3", Type: ArgTypeString},
252+
},
253+
},
254+
argName: strPtr("arg1"),
255+
wantNamed: &Arg{Name: "arg1", Value: "value1", Type: ArgTypeString},
256+
found: true,
257+
},
258+
{
259+
name: "found named arg, second",
260+
tag: Tag{
261+
Name: "tag",
262+
Args: []Arg{
263+
{Name: "arg1", Value: "value1", Type: ArgTypeString},
264+
{Name: "arg2", Value: "value2", Type: ArgTypeString},
265+
{Name: "arg3", Value: "value3", Type: ArgTypeString},
266+
},
267+
},
268+
argName: strPtr("arg3"),
269+
wantNamed: &Arg{Name: "arg3", Value: "value3", Type: ArgTypeString},
270+
found: true,
271+
},
272+
{
273+
name: "not found named arg, no args",
274+
tag: Tag{
275+
Name: "tag",
276+
Args: []Arg{},
277+
},
278+
argName: strPtr("arg1"),
279+
found: false,
280+
},
281+
{
282+
name: "not found named arg, not in args",
283+
tag: Tag{
284+
Name: "tag",
285+
Args: []Arg{
286+
{Name: "arg1", Value: "value1", Type: ArgTypeString},
287+
{Name: "arg2", Value: "value2", Type: ArgTypeString},
288+
{Name: "arg3", Value: "value3", Type: ArgTypeString},
289+
},
290+
},
291+
argName: strPtr("arg4"),
292+
found: false,
293+
},
294+
{
295+
name: "not found named arg, only positional args",
296+
tag: Tag{
297+
Name: "tag",
298+
Args: []Arg{
299+
{Value: "value1", Type: ArgTypeString},
300+
},
301+
},
302+
argName: strPtr(""),
303+
found: false,
304+
},
305+
}
306+
307+
for _, tt := range tests {
308+
t.Run(tt.name, func(t *testing.T) {
309+
if tt.wantPositional != nil {
310+
got, ok := tt.tag.PositionalArg()
311+
if ok != tt.found {
312+
t.Fatalf("got: %v, want: %v", ok, tt.found)
313+
}
314+
if !reflect.DeepEqual(got, *tt.wantPositional) {
315+
t.Fatalf("got: %v, want: %v", got, tt.wantPositional)
316+
}
317+
}
318+
if tt.argName != nil {
319+
got, ok := tt.tag.NamedArg(*tt.argName)
320+
if ok != tt.found {
321+
t.Fatalf("got: %v, want: %v", ok, tt.found)
322+
}
323+
if tt.wantNamed != nil {
324+
if !reflect.DeepEqual(got, *tt.wantNamed) {
325+
t.Fatalf("got: %v, want: %v", got, tt.wantNamed)
326+
}
327+
}
328+
}
329+
})
330+
}
331+
}

0 commit comments

Comments
 (0)