-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.go
More file actions
158 lines (143 loc) · 3.89 KB
/
Copy pathapi.go
File metadata and controls
158 lines (143 loc) · 3.89 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package argparse
// VarArgByName returns the variadic parameters for the argument named arg.
// It panics if arg is not defined or is not the last argument.
func (p *Parser) VarArgByName(arg string) []string {
if len(p.ArgDefs) == 0 {
panic("argument " + arg + " not defined")
} else if len(p.Args) == 0 {
return p.Args[:0]
}
// Variadic argument is guaranteed to be the last argument
defsBefore := len(p.ArgDefs) - 1
lastDef := p.ArgDefs[defsBefore]
if lastDef.Name != arg {
panic("argument " + arg + " not defined or is not the last argument")
}
return p.Args[defsBefore:]
}
// ArgAt returns the i'th argument in p.Args. The first argument is at index 1.
// If i is out of range, ArgAt returns "". ArgAt panics if i < 1.
func (p *Parser) ArgAt(i int) string {
switch {
case i == 0:
panic("Parser.Arg(0): the first argument index is 1")
case i < 0:
panic("negative argument index")
case i > len(p.Args):
return ""
}
return p.Args[i-1]
}
// ArgByName returns the value of the argument named name. ArgByName panics
// if name is not defined. If name is a variadic parameter, ArgByName returns
// the first value; [Parser.VariadicArgByName] should be used instead.
func (p *Parser) ArgByName(name string) string {
i, ok := p.ArgNames[name]
if !ok {
panic("argument " + name + " not defined")
}
if i >= len(p.Args) {
return ""
}
return p.Args[i]
}
// Flag returns the value of the flag name.
func (p *Parser) Flag(name string) *Flag {
name = p.resolve(name)
f, ok := p.Flags[name]
if !ok {
return p.FlagDefs[name].Default
}
return f
}
func FormatFlag(flag string) string {
if len(flag) == 1 {
return "-" + flag
}
return "--" + flag
}
func (p *Parser) BoolFlag(name, desc string, def bool, aliases ...string) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeBool,
Default: newDefaultFlag(TypeBool, def),
Description: desc,
}
p.makeAliases(name, aliases)
return p
}
func (p *Parser) StringFlag(name, desc, param, def string, aliases ...string) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeString,
Default: newDefaultFlag(TypeString, def),
Description: desc,
ParamName: param,
}
p.makeAliases(name, aliases)
return p
}
func (p *Parser) EnumFlag(
name, desc, param string,
opts map[string]any, default_ string, aliases ...string,
) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeEnum,
Default: newDefaultFlag(TypeEnum, &Enum{default_, opts[default_]}),
Description: desc,
ParamName: param,
}
p.SetOptions(name, opts)
p.makeAliases(name, aliases)
return p
}
func (p *Parser) Int(name, desc, param string, def int, aliases ...string) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeInt,
Default: newDefaultFlag(TypeInt, def),
Description: desc,
ParamName: param,
}
p.makeAliases(name, aliases)
return p
}
func (p *Parser) ListFlag(name, desc, param string, def []any, aliases ...string) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeList,
Default: newDefaultFlag(TypeList, def),
Description: desc,
ParamName: param,
}
p.makeAliases(name, aliases)
return p
}
func (p *Parser) ListFlagOf(
name, desc, param string,
itemType FlagType, opts map[string]any,
def []any, aliases ...string,
) *Parser {
p.FlagDefs[name] = FlagDef{
Type: TypeList,
ItemType: itemType,
Default: newDefaultFlag(TypeList, def),
Description: desc,
ParamName: param,
}
p.makeAliases(name, aliases)
if opts != nil {
p.SetOptions(name, opts)
}
return p
}
// ResolveFlag finds the flag name from any alises. ResolveFlag returns name if not found.
func (p *Parser) ResolveFlag(name string) string {
return p.resolve(name)
}
func (p *Parser) SetOptions(flag string, opts map[string]any) {
if p.enumOpts == nil {
p.enumOpts = make(map[string]map[string]any)
}
p.enumOpts[flag] = opts
}
func (p *Parser) GetOptions(flag string) map[string]any {
return p.enumOpts[flag]
}
// TODO: SetDefaults