Skip to content

Commit 30c5a98

Browse files
committed
Add support to different int/uint types
1 parent 97ed291 commit 30c5a98

File tree

3 files changed

+273
-84
lines changed

3 files changed

+273
-84
lines changed

args.go

Lines changed: 105 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -227,17 +227,33 @@ func (a *ArgumentsBase[T, C, VC]) Get() any {
227227

228228
type (
229229
FloatArg = ArgumentBase[float64, NoConfig, floatValue]
230-
IntArg = ArgumentBase[int64, IntegerConfig, intValue]
230+
IntArg = ArgumentBase[int, IntegerConfig, intValue[int]]
231+
Int8Arg = ArgumentBase[int8, IntegerConfig, intValue[int8]]
232+
Int16Arg = ArgumentBase[int16, IntegerConfig, intValue[int16]]
233+
Int32Arg = ArgumentBase[int32, IntegerConfig, intValue[int32]]
234+
Int64Arg = ArgumentBase[int64, IntegerConfig, intValue[int64]]
231235
StringArg = ArgumentBase[string, StringConfig, stringValue]
232236
StringMapArgs = ArgumentBase[map[string]string, StringConfig, StringMap]
233237
TimestampArg = ArgumentBase[time.Time, TimestampConfig, timestampValue]
234-
UintArg = ArgumentBase[uint64, IntegerConfig, uintValue]
238+
UintArg = ArgumentBase[uint, IntegerConfig, uintValue[uint]]
239+
Uint8Arg = ArgumentBase[uint8, IntegerConfig, uintValue[uint8]]
240+
Uint16Arg = ArgumentBase[uint16, IntegerConfig, uintValue[uint16]]
241+
Uint32Arg = ArgumentBase[uint32, IntegerConfig, uintValue[uint32]]
242+
Uint64Arg = ArgumentBase[uint64, IntegerConfig, uintValue[uint64]]
235243

236244
FloatArgs = ArgumentsBase[float64, NoConfig, floatValue]
237-
IntArgs = ArgumentsBase[int64, IntegerConfig, intValue]
245+
IntArgs = ArgumentsBase[int, IntegerConfig, intValue[int]]
246+
Int8Args = ArgumentsBase[int8, IntegerConfig, intValue[int8]]
247+
Int16Args = ArgumentsBase[int16, IntegerConfig, intValue[int16]]
248+
Int32Args = ArgumentsBase[int32, IntegerConfig, intValue[int32]]
249+
Int64Args = ArgumentsBase[int64, IntegerConfig, intValue[int64]]
238250
StringArgs = ArgumentsBase[string, StringConfig, stringValue]
239251
TimestampArgs = ArgumentsBase[time.Time, TimestampConfig, timestampValue]
240-
UintArgs = ArgumentsBase[uint64, IntegerConfig, uintValue]
252+
UintArgs = ArgumentsBase[uint, IntegerConfig, uintValue[uint]]
253+
Uint8Args = ArgumentsBase[uint8, IntegerConfig, uintValue[uint8]]
254+
Uint16Args = ArgumentsBase[uint16, IntegerConfig, uintValue[uint16]]
255+
Uint32Args = ArgumentsBase[uint32, IntegerConfig, uintValue[uint32]]
256+
Uint64Args = ArgumentsBase[uint64, IntegerConfig, uintValue[uint64]]
241257
)
242258

243259
func (c *Command) getArgValue(name string) any {
@@ -252,82 +268,115 @@ func (c *Command) getArgValue(name string) any {
252268
return nil
253269
}
254270

255-
func (c *Command) StringArg(name string) string {
271+
func arg[T any](name string, c *Command) T {
256272
val := c.getArgValue(name)
257-
if a, ok := val.(string); ok {
273+
if a, ok := val.(T); ok {
258274
return a
259275
}
260-
return ""
276+
var zero T
277+
return zero
278+
}
279+
280+
func (c *Command) StringArg(name string) string {
281+
return arg[string](name, c)
261282
}
262283

263284
func (c *Command) StringArgs(name string) []string {
264-
val := c.getArgValue(name)
265-
if a, ok := val.([]string); ok {
266-
return a
267-
}
268-
return nil
285+
return arg[[]string](name, c)
269286
}
270287

271288
func (c *Command) FloatArg(name string) float64 {
272-
val := c.getArgValue(name)
273-
if a, ok := val.(float64); ok {
274-
return a
275-
}
276-
return 0
289+
return arg[float64](name, c)
277290
}
278291

279292
func (c *Command) FloatArgs(name string) []float64 {
280-
val := c.getArgValue(name)
281-
if a, ok := val.([]float64); ok {
282-
return a
283-
}
284-
return nil
293+
return arg[[]float64](name, c)
285294
}
286295

287-
func (c *Command) IntArg(name string) int64 {
288-
val := c.getArgValue(name)
289-
if a, ok := val.(int64); ok {
290-
return a
291-
}
292-
return 0
296+
func (c *Command) IntArg(name string) int {
297+
return arg[int](name, c)
293298
}
294299

295-
func (c *Command) IntArgs(name string) []int64 {
296-
val := c.getArgValue(name)
297-
if a, ok := val.([]int64); ok {
298-
return a
299-
}
300-
return nil
300+
func (c *Command) IntArgs(name string) []int {
301+
return arg[[]int](name, c)
301302
}
302303

303-
func (c *Command) UintArg(name string) uint64 {
304-
val := c.getArgValue(name)
305-
if a, ok := val.(uint64); ok {
306-
return a
307-
}
308-
return 0
304+
func (c *Command) Int8Arg(name string) int8 {
305+
return arg[int8](name, c)
309306
}
310307

311-
func (c *Command) UintArgs(name string) []uint64 {
312-
val := c.getArgValue(name)
313-
if a, ok := val.([]uint64); ok {
314-
return a
315-
}
316-
return nil
308+
func (c *Command) Int8Args(name string) []int8 {
309+
return arg[[]int8](name, c)
310+
}
311+
312+
func (c *Command) Int16Arg(name string) int16 {
313+
return arg[int16](name, c)
314+
}
315+
316+
func (c *Command) Int16Args(name string) []int16 {
317+
return arg[[]int16](name, c)
318+
}
319+
320+
func (c *Command) Int32Arg(name string) int32 {
321+
return arg[int32](name, c)
322+
}
323+
324+
func (c *Command) Int32Args(name string) []int32 {
325+
return arg[[]int32](name, c)
326+
}
327+
328+
func (c *Command) Int64Arg(name string) int64 {
329+
return arg[int64](name, c)
330+
}
331+
332+
func (c *Command) Int64Args(name string) []int64 {
333+
return arg[[]int64](name, c)
334+
}
335+
336+
func (c *Command) UintArg(name string) uint {
337+
return arg[uint](name, c)
338+
}
339+
340+
func (c *Command) Uint8Arg(name string) uint8 {
341+
return arg[uint8](name, c)
342+
}
343+
344+
func (c *Command) Uint16Arg(name string) uint16 {
345+
return arg[uint16](name, c)
346+
}
347+
348+
func (c *Command) Uint32Arg(name string) uint32 {
349+
return arg[uint32](name, c)
350+
}
351+
352+
func (c *Command) Uint64Arg(name string) uint64 {
353+
return arg[uint64](name, c)
354+
}
355+
356+
func (c *Command) UintArgs(name string) []uint {
357+
return arg[[]uint](name, c)
358+
}
359+
360+
func (c *Command) Uint8Args(name string) []uint8 {
361+
return arg[[]uint8](name, c)
362+
}
363+
364+
func (c *Command) Uint16Args(name string) []uint16 {
365+
return arg[[]uint16](name, c)
366+
}
367+
368+
func (c *Command) Uint32Args(name string) []uint32 {
369+
return arg[[]uint32](name, c)
370+
}
371+
372+
func (c *Command) Uint64Args(name string) []uint64 {
373+
return arg[[]uint64](name, c)
317374
}
318375

319376
func (c *Command) TimestampArg(name string) time.Time {
320-
val := c.getArgValue(name)
321-
if a, ok := val.(time.Time); ok {
322-
return a
323-
}
324-
return time.Time{}
377+
return arg[time.Time](name, c)
325378
}
326379

327380
func (c *Command) TimestampArgs(name string) []time.Time {
328-
val := c.getArgValue(name)
329-
if a, ok := val.([]time.Time); ok {
330-
return a
331-
}
332-
return nil
381+
return arg[[]time.Time](name, c)
333382
}

args_test.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,52 @@ func TestArgumentsRootCommand(t *testing.T) {
1212
tests := []struct {
1313
name string
1414
args []string
15-
expectedIvals []int64
16-
expectedUivals []uint64
15+
expectedIvals []int
16+
expectedUivals []uint
1717
expectedFvals []float64
1818
errStr string
1919
}{
2020
{
2121
name: "set ival",
2222
args: []string{"foo", "10"},
23-
expectedIvals: []int64{10},
24-
expectedUivals: []uint64{},
23+
expectedIvals: []int{10},
24+
expectedUivals: []uint{},
2525
expectedFvals: []float64{},
2626
},
2727
{
2828
name: "set invalid ival",
2929
args: []string{"foo", "10.0"},
30-
expectedIvals: []int64{},
31-
expectedUivals: []uint64{},
30+
expectedIvals: []int{},
31+
expectedUivals: []uint{},
3232
expectedFvals: []float64{},
3333
errStr: "strconv.ParseInt: parsing \"10.0\": invalid syntax",
3434
},
3535
{
3636
name: "set ival uival",
3737
args: []string{"foo", "-10", "11"},
38-
expectedIvals: []int64{-10},
39-
expectedUivals: []uint64{11},
38+
expectedIvals: []int{-10},
39+
expectedUivals: []uint{11},
4040
expectedFvals: []float64{},
4141
},
4242
{
4343
name: "set ival uival fval",
4444
args: []string{"foo", "-12", "14", "10.1"},
45-
expectedIvals: []int64{-12},
46-
expectedUivals: []uint64{14},
45+
expectedIvals: []int{-12},
46+
expectedUivals: []uint{14},
4747
expectedFvals: []float64{10.1},
4848
},
4949
{
5050
name: "set ival uival multu fvals",
5151
args: []string{"foo", "-13", "12", "10.1", "11.09"},
52-
expectedIvals: []int64{-13},
53-
expectedUivals: []uint64{12},
52+
expectedIvals: []int{-13},
53+
expectedUivals: []uint{12},
5454
expectedFvals: []float64{10.1, 11.09},
5555
},
5656
{
5757
name: "set fvals beyond max",
5858
args: []string{"foo", "13", "10", "10.1", "11.09", "12.1"},
59-
expectedIvals: []int64{13},
60-
expectedUivals: []uint64{10},
59+
expectedIvals: []int{13},
60+
expectedUivals: []uint{10},
6161
expectedFvals: []float64{10.1, 11.09},
6262
errStr: "No help topic for '12.1'",
6363
},
@@ -66,8 +66,8 @@ func TestArgumentsRootCommand(t *testing.T) {
6666
for _, test := range tests {
6767
t.Run(test.name, func(t *testing.T) {
6868
cmd := buildMinimalTestCommand()
69-
var ivals []int64
70-
var uivals []uint64
69+
var ivals []int
70+
var uivals []uint
7171
var fvals []float64
7272
cmd.Arguments = []Argument{
7373
&IntArgs{
@@ -147,7 +147,7 @@ func TestArgumentsSubcommand(t *testing.T) {
147147
tests := []struct {
148148
name string
149149
args []string
150-
expectedIval int64
150+
expectedIval int
151151
expectedSvals []string
152152
expectedTVals []time.Time
153153
errStr string
@@ -176,7 +176,7 @@ func TestArgumentsSubcommand(t *testing.T) {
176176
for _, test := range tests {
177177
t.Run(test.name, func(t *testing.T) {
178178
cmd := buildMinimalTestCommand()
179-
var ival int64
179+
var ival int
180180
var svals []string
181181
var tvals []time.Time
182182
cmd.Commands = []*Command{

0 commit comments

Comments
 (0)