@@ -172,7 +172,7 @@ func (p *Parser) WorkspaceTagDefaults(ctx context.Context) (map[string]string, e
172
172
if err != nil {
173
173
return nil , xerrors .Errorf ("load variable defaults: %w" , err )
174
174
}
175
- paramsDefaults , err := p .CoderParameterDefaults (ctx )
175
+ paramsDefaults , err := p .CoderParameterDefaults (ctx , varsDefaults )
176
176
if err != nil {
177
177
return nil , xerrors .Errorf ("load parameter defaults: %w" , err )
178
178
}
@@ -268,7 +268,7 @@ func (p *Parser) VariableDefaults(ctx context.Context) (map[string]string, error
268
268
269
269
// CoderParameterDefaults returns the default values of all coder_parameter data sources
270
270
// in the parsed module.
271
- func (p * Parser ) CoderParameterDefaults (ctx context.Context ) (map [string ]string , error ) {
271
+ func (p * Parser ) CoderParameterDefaults (ctx context.Context , varsDefaults map [ string ] string ) (map [string ]string , error ) {
272
272
defaultsM := make (map [string ]string )
273
273
var (
274
274
skipped []string
@@ -316,14 +316,28 @@ func (p *Parser) CoderParameterDefaults(ctx context.Context) (map[string]string,
316
316
}
317
317
318
318
if _ , ok := resContent .Attributes ["default" ]; ! ok {
319
+ p .logger .Warn (ctx , "coder_parameter data source does not have a default value" , slog .F ("name" , dataResource .Name ))
319
320
defaultsM [dataResource .Name ] = ""
320
321
} else {
321
322
expr := resContent .Attributes ["default" ].Expr
322
323
value , err := previewFileContent (expr .Range ())
323
324
if err != nil {
324
325
return nil , xerrors .Errorf ("can't preview the resource file: %v" , err )
325
326
}
326
- defaultsM [dataResource .Name ] = strings .Trim (value , `"` )
327
+ // Issue #15795: the "default" value could also be an expression we need
328
+ // to evaluate.
329
+ // TODO: should we support coder_parameter default values that reference other coder_parameter data sources?
330
+ evalCtx := buildEvalContext (varsDefaults , nil )
331
+ val , diags := expr .Value (evalCtx )
332
+ if diags .HasErrors () {
333
+ return nil , xerrors .Errorf ("failed to evaluate coder_parameter %q default value %q: %s" , dataResource .Name , value , diags .Error ())
334
+ }
335
+ // Do not use "val.AsString()" as it can panic
336
+ strVal , err := ctyValueString (val )
337
+ if err != nil {
338
+ return nil , xerrors .Errorf ("failed to marshal coder_parameter %q default value %q as string: %s" , dataResource .Name , value , err )
339
+ }
340
+ defaultsM [dataResource .Name ] = strings .Trim (strVal , `"` )
327
341
}
328
342
}
329
343
}
0 commit comments