/
cli_prov.go
96 lines (82 loc) · 1.74 KB
/
cli_prov.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
package config
import (
"flag"
"sync/atomic"
)
type cliProv struct {
settings *atomic.Value
}
var (
cliInst *cliProv
)
var (
knownFlags = []struct {
tp string
name string
param string
dflt interface{}
descr string
}{
// tp, stands for type can be either value or flag.
// The cast is expected to be performed by the client.
{"value", "config.file", "config", "",
"Location of the config file"},
{"value", "flow.plugin.path", "flow-plugin-path", "",
"Flow plugin path"},
}
)
func init() {
cliInst = &cliProv{
settings: &atomic.Value{},
}
cliInst.Setup()
}
func (c *cliProv) Setup() error {
settings := make(map[string]interface{})
for _, flg := range knownFlags {
switch flg.tp {
case "value":
settings[flg.name] = flag.String(flg.param, flg.dflt.(string), flg.descr)
case "flag":
settings[flg.name] = flag.Bool(flg.param, flg.dflt.(bool), flg.descr)
// add more types if needed
}
if err := Register(flg.name, c); err != nil {
return err
}
}
c.settings.Store(settings)
return nil
}
func (c *cliProv) GetOptions() ProviderOptions {
return 0
}
func (c *cliProv) GetValue(key string) (interface{}, bool) {
s := c.settings.Load().(map[string]interface{})
if v, ok := s[key]; ok {
if vConv, convOk := v.(*string); convOk {
if *vConv == "" {
return nil, false
}
return *vConv, true
} else if vConv, convOk := v.(*int); convOk {
return *vConv, true
} else if vConv, convOk := v.(*bool); convOk {
return *vConv, true
}
}
return nil, false
}
func (c *cliProv) GetWeight() uint32 {
return 50
}
func (c *cliProv) Resolve() error {
flag.Parse()
return nil
}
func (c *cliProv) DependsOn() []string {
return []string{}
}
func (c *cliProv) GetName() string {
return "cli"
}