-
Notifications
You must be signed in to change notification settings - Fork 0
/
loader.tpl
112 lines (99 loc) · 3.54 KB
/
loader.tpl
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
// Code generated by "{{ .Command }}"; DO NOT EDIT.
package {{ .Package }}
import (
{{- range .Imports}}
{{ with .Name }}{{ . }} {{ end }}"{{ .Path }}"{{ end }}
)
{{ range .Fields }}
{{ if ne .Strategy "Native" }}
// wrapper type for {{ .Name }} {{ .TypeName }}
{{ if .TypeElement }}
type value{{ .Name }} struct {
value *[]{{ .TypeElement }}
changed bool
}
func (x *value{{ .Name }}) Set(s string) error {
ss := strings.Split(s, ",")
out := make([]{{ .TypeElement }}, len(ss))
for i, d := range ss {
var err error
{{ if eq .Strategy "Set" }}
err = out[i].Set(d)
{{ else if eq .Strategy "Enumer" }}
out[i], err = {{.TypeName}}String(s)
{{ else }}
{{ fail (printf "unhandled strategy [%s]" .Strategy) }}
{{ end }}
if err != nil {
return err
}
}
if !x.changed {
*x.value = out
x.changed = true
} else {
*x.value = append(*x.value, out...)
}
return nil
}
func (x *value{{ .Name }}) String() string {
return ""
}
func (x *value{{ .Name }}) Type() string {
return "{{ .TypeName }}"
}
{{ else }}
type value{{ .Name }} {{ .TypeName }}
func (x *value{{ .Name }}) Set(s string) error {
{{ if eq .Strategy "Set" }}
var v {{.TypeName}}
err := v.Set(s)
if err == nil {
*x = value{{.Name}}(v)
}
return err
{{ else if eq .Strategy "Enumer" }}
v, err := {{.TypeName}}String(s)
*x = value{{.Name}}(v)
return err
{{ else }}
{{ fail (printf "unhandled strategy [%s]" .Strategy) }}
{{ end }}
}
func (x value{{ .Name }}) String() string {
return ""
}
func (x value{{ .Name }}) Type() string {
return "{{ .TypeName }}"
}
{{ end }}
{{ end }}
{{ end }}
func (c *{{ .ConfigStruct }}) Load(args []string, flagset *{{ .Pflag }}.FlagSet, env map[string]string) {
{{ range .Fields }}
// {{ .Name }} {{ .TypeName }}
{{ if eq .Strategy "Native" }}flagset.{{ .NativeFn }}(&c.{{ .Name }}, "{{ .FlagName }}", c.{{ .Name }}, `{{ .Description }}`)
{{ else }}
{{ if .TypeElement }}
// whatev
{{ else }}
flagset.Var((*value{{ .Name }})(&c.{{ .Name }}), "{{ .FlagName }}", `{{ .Description }}`)
{{ end }}
{{ end }}
{{ if .Hidden }}flagset.Lookup("{{ .FlagName }}").MarkHidden(true){{ end }}
{{ if .EnvName }}if v, ok := env["{{ .EnvName }}"]; ok {
flagset.Set("{{ .Name }}", v)
}{{ end }}
{{ end }}
}
func (c *{{ .ConfigStruct }}) Start() {
flagset := {{ .Pflag }}.NewFlagSet(os.Args[0], {{ .Pflag }}.ExitOnError)
env := map[string]string{}
for _, v := range os.Environ() {
equals := strings.IndexByte(v, '=')
if equals != -1 {
env[v[:equals]] = v[equals+1:]
}
}
c.Load(os.Args[1:], flagset, env)
}