forked from urfave/sflags
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgpflag.go
69 lines (61 loc) · 1.89 KB
/
gpflag.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
package gpflag
import (
"os"
"github.com/spf13/pflag"
"github.com/urfave/sflags"
)
// flagSet describes interface,
// that's implemented by pflag library and required by sflags.
type flagSet interface {
VarPF(value pflag.Value, name, shorthand, usage string) *pflag.Flag
}
var _ flagSet = (*pflag.FlagSet)(nil)
// GenerateTo takes a list of sflag.Flag,
// that are parsed from some config structure, and put it to dst.
func GenerateTo(src []*sflags.Flag, dst flagSet) {
for _, srcFlag := range src {
flag := dst.VarPF(srcFlag.Value, srcFlag.Name, srcFlag.Short, srcFlag.Usage)
if boolFlag, casted := srcFlag.Value.(sflags.BoolFlag); casted && boolFlag.IsBoolFlag() {
// pflag uses -1 in this case,
// we will use the same behaviour as in flag library
flag.NoOptDefVal = "true"
}
flag.Hidden = srcFlag.Hidden
if srcFlag.Deprecated {
// we use Usage as Deprecated message for a pflag
flag.Deprecated = srcFlag.Usage
if flag.Deprecated == "" {
flag.Deprecated = "Deprecated"
}
}
}
}
// ParseTo parses cfg, that is a pointer to some structure,
// and puts it to dst.
func ParseTo(cfg interface{}, dst flagSet, optFuncs ...sflags.OptFunc) error {
flags, err := sflags.ParseStruct(cfg, optFuncs...)
if err != nil {
return err
}
GenerateTo(flags, dst)
return nil
}
// Parse parses cfg, that is a pointer to some structure,
// puts it to the new pflag.FlagSet and returns it.
func Parse(cfg interface{}, optFuncs ...sflags.OptFunc) (*pflag.FlagSet, error) {
fs := pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
err := ParseTo(cfg, fs, optFuncs...)
if err != nil {
return nil, err
}
return fs, nil
}
// ParseToDef parses cfg, that is a pointer to some structure and
// puts it to the default pflag.CommandLine.
func ParseToDef(cfg interface{}, optFuncs ...sflags.OptFunc) error {
err := ParseTo(cfg, pflag.CommandLine, optFuncs...)
if err != nil {
return err
}
return nil
}