-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtypes.go
More file actions
115 lines (99 loc) · 3.17 KB
/
types.go
File metadata and controls
115 lines (99 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package argparse
import (
"errors"
"fmt"
"io"
"strconv"
)
func Bool(name string, v *bool) Option {
return Option{Name: name, Callback: func(ctx *Context, args ...string) {
*v = true
}}
}
func String(name string, v *string) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
*v = args[0]
}}
}
func StringAddr(name string, v **string) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
*v = &args[0]
}}
}
func StringAppend(name string, v *[]string) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
*v = append(*v, args[0])
}}
}
func StringPositional(name string, v *string) Option {
return String(name, v).SetPositional(true)
}
func StringAddrPositional(name string, v **string) Option {
return StringAddr(name, v).SetPositional(true)
}
func StringAppendPositional(name string, v *[]string) Option {
return Option{Name: name, Positional: true, Nargs: -1, Callback: func(ctx *Context, args ...string) {
*v = append(*v, args[0])
}}
}
func StringRest(name string, v *[]string) Option {
return Option{Name: name, Callback: func(ctx *Context, args ...string) {
ctx.Abort()
*v = append(*v, ctx.Remain()...)
}}
}
func StringRestPositional(name string, v *[]string) Option {
return Option{Name: name, Positional: true, Nargs: 1, Callback: func(ctx *Context, args ...string) {
ctx.Abort()
*v = append(*v, args[0])
*v = append(*v, ctx.Remain()...)
}}
}
func Sscanf(name string, format string, v ...any) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
if _, err := fmt.Sscanf(args[0], format, v...); err != nil {
var rerr error
if errors.Is(err, io.EOF) {
rerr = fmt.Errorf("option %s %q is invalid", ctx.Option().String(), args[0])
} else {
rerr = fmt.Errorf("option %s %q is invalid: %s", ctx.Option().String(), args[0], err.Error())
}
ctx.AbortWithError(rerr)
}
}}
}
func Int(name string, v *int) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
if num, err := strconv.Atoi(args[0]); err != nil {
ctx.AbortWithError(fmt.Errorf("option %s %q requires an integer", ctx.Option().String(), args[0]))
} else {
*v = num
}
}}
}
func Uint(name string, v *uint) Option {
return Option{Name: name, Nargs: 1, Callback: func(ctx *Context, args ...string) {
if num, err := strconv.ParseUint(args[0], 10, 0); err != nil {
ctx.AbortWithError(fmt.Errorf("option %s %q requires an unsigned integer", ctx.Option().String(), args[0]))
} else {
*v = uint(num)
}
}}
}
func IntPositional(name string, v *int) Option {
return Int(name, v).SetPositional(true)
}
func IntAppendPositional(name string, v *[]int) Option {
return Option{Name: name, Positional: true, Nargs: -1, Callback: func(ctx *Context, args ...string) {
if num, err := strconv.Atoi(args[0]); err != nil {
ctx.AbortWithError(fmt.Errorf("option %s %q requires an integer", ctx.Option().String(), args[0]))
} else {
*v = append(*v, num)
}
}}
}
func Func(name string, f func()) Option {
return Option{Name: name, Callback: func(ctx *Context, args ...string) {
f()
}}
}