@@ -49,6 +49,7 @@ type Field struct {
49
49
Enterprise bool
50
50
Hidden bool
51
51
Type string
52
+ ViperType string
52
53
}
53
54
54
55
func GenerateData (ctx context.Context , log slog.Logger , dir string ) (* Data , error ) {
@@ -123,6 +124,7 @@ func (g *Generator) generateAll() (*Data, error) {
123
124
if ! ok {
124
125
return nil , xerrors .Errorf ("expected struct type, found %T" , spec .Type )
125
126
}
127
+
126
128
for _ , field := range t .Fields .List {
127
129
key := reflect .StructTag (strings .Trim (field .Tag .Value , "`" )).Get ("mapstructure" )
128
130
if key == "" {
@@ -132,24 +134,37 @@ func (g *Generator) generateAll() (*Data, error) {
132
134
Key : key ,
133
135
Env : "CODER_" + strings .ReplaceAll (strings .ToUpper (key ), "-" , "_" ),
134
136
}
135
- ft , ok := field .Type .(* ast.Ident )
136
- if ! ok {
137
- // return nil, xerrors.Errorf("expected Ident type, found %T", field.Type)
138
- continue
139
- }
140
- switch ft .Name {
141
- case "string" :
142
- f .Type = "String"
143
- case "int" :
144
- f .Type = "Int"
145
- case "bool" :
146
- f .Type = "Bool"
147
- case "[]string" :
148
- f .Type = "StringArray"
149
- case "time.Duration" :
137
+ switch ft := field .Type .(type ) {
138
+ case * ast.Ident :
139
+ switch ft .Name {
140
+ case "string" :
141
+ f .Type = "String"
142
+ f .ViperType = "String"
143
+ case "int" :
144
+ f .Type = "Int"
145
+ f .ViperType = "Int"
146
+ case "bool" :
147
+ f .Type = "Bool"
148
+ f .ViperType = "Bool"
149
+ default :
150
+ continue
151
+ }
152
+ case * ast.SelectorExpr :
153
+ if ft .Sel .Name != "Duration" {
154
+ continue
155
+ }
150
156
f .Type = "Duration"
151
- default :
152
- continue
157
+ f .ViperType = "Duration"
158
+ case * ast.ArrayType :
159
+ i , ok := ft .Elt .(* ast.Ident )
160
+ if ! ok {
161
+ continue
162
+ }
163
+ if i .Name != "string" {
164
+ continue
165
+ }
166
+ f .Type = "StringArray"
167
+ f .ViperType = "StringSlice"
153
168
}
154
169
155
170
for _ , line := range field .Doc .List {
@@ -225,6 +240,7 @@ package deployment
225
240
import (
226
241
"os"
227
242
"path/filepath"
243
+ "time"
228
244
229
245
"github.com/spf13/pflag"
230
246
"github.com/spf13/viper"
@@ -254,7 +270,7 @@ func DefaultViper() *viper.Viper {
254
270
func AttachFlags(flagset *pflag.FlagSet, vip *viper.Viper) {
255
271
{{- range .Fields }}
256
272
{{- if and (.Flag) (not .Enterprise) }}
257
- _ = flagset.{{ .Type }}P("{{ .Flag }}", "{{ .Shorthand }}", vip.Get{{ .Type }}("{{ .Key }}"), ` + "`{{ .Usage }}`" + `+"\n"+cliui.Styles.Placeholder.Render("Consumes ${{ .Env }}"))
273
+ _ = flagset.{{ .Type }}P("{{ .Flag }}", "{{ .Shorthand }}", vip.Get{{ .ViperType }}("{{ .Key }}"), ` + "`{{ .Usage }}`" + `+"\n"+cliui.Styles.Placeholder.Render("Consumes ${{ .Env }}"))
258
274
_ = vip.BindPFlag("{{ .Key }}", flagset.Lookup("{{ .Flag }}"))
259
275
{{- if and .Hidden }}
260
276
_ = flagset.MarkHidden("{{ .Flag }}")
@@ -266,7 +282,7 @@ func AttachFlags(flagset *pflag.FlagSet, vip *viper.Viper) {
266
282
func AttachEnterpriseFlags(flagset *pflag.FlagSet, vip *viper.Viper) {
267
283
{{- range .Fields }}
268
284
{{- if and (.Flag) (.Enterprise) }}
269
- _ = flagset.{{ .Type }}P("{{ .Flag }}", "{{ .Shorthand }}", vip.Get{{ .Type }}("{{ .Key }}"), ` + "`{{ .Usage }}`" + `)
285
+ _ = flagset.{{ .Type }}P("{{ .Flag }}", "{{ .Shorthand }}", vip.Get{{ .ViperType }}("{{ .Key }}"), ` + "`{{ .Usage }}`" + `)
270
286
_ = vip.BindPFlag("{{ .Key }}", flagset.Lookup("{{ .Flag }}"))
271
287
{{- if and .Hidden }}
272
288
_ = flagset.MarkHidden("{{ .Flag }}")
0 commit comments