-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathflags.go
109 lines (86 loc) · 1.94 KB
/
flags.go
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
package cli
type Flag struct {
Value Value
Short string
Long string
Usage Usager
Necessary Necessary
set bool
defaultSaved bool
defaultValue string
defaultEmpty bool
commandFlag bool
// NOTE(SuperPaintman):
// The first version had "Aliases" for flags. It's quite handy to have
// (e.g. --dry and --dry-run) but at the same time makes API a bit
// confusing because of duplication logic.
//
// I decided to remove aliases. It's not so commonly used feature and
// developers can easely make a workaround if they need it.
}
func newFlag(value Value, opts FlagOptions) Flag {
return Flag{
Value: value,
Short: opts.Short,
Long: opts.Long,
Usage: opts.Usage,
Necessary: opts.Necessary,
commandFlag: opts.commandFlag,
}
}
func (f *Flag) Type() string {
if t, ok := f.Value.(Typer); ok {
return t.Type()
}
return ""
}
func (f *Flag) Required() bool {
return f.Necessary == Required
}
func (f *Flag) Set() bool {
return f.set
}
func (f *Flag) MarkSet() {
f.set = true
}
func (f *Flag) Default() (v string, empty bool) {
if !f.defaultSaved {
return "", true
}
return f.defaultValue, f.defaultEmpty
}
func (f *Flag) SaveDefault() {
f.defaultValue = f.Value.String()
if ev, ok := f.Value.(Emptier); ok {
f.defaultEmpty = ev.Empty()
} else {
f.defaultEmpty = f.defaultValue == ""
}
f.defaultSaved = true
}
func (f *Flag) String() string {
v := "Flag("
v += f.Type()
if f.Short != "" {
v += ","
v += "-" + f.Short
}
if f.Long != "" {
if v == "" {
v += ","
} else {
v += "/"
}
v += "--" + f.Long
}
v += ")"
return v
}
func Var(register Register, value Value, name string, options ...FlagOptionApplyer) error {
var opts FlagOptions
opts.applyName(name)
opts.applyFlagOptions(options)
return register.RegisterFlag(newFlag(value, opts))
}
//go:generate python ./generate_flags.py
//go:generate python ./generate_multi_flags.py