@@ -269,14 +269,7 @@ func (p *Parser) Load(ctx context.Context) (*evaluator, error) {
269
269
return nil , err
270
270
}
271
271
p .logger .Debug ("Added input variables from tfvars" , log .Int ("count" , len (inputVars )))
272
-
273
- if missingVars := missingVariableValues (blocks , inputVars ); len (missingVars ) > 0 {
274
- p .logger .Warn (
275
- "Variable values was not found in the environment or variable files. Evaluating may not work correctly." ,
276
- log .String ("variables" , strings .Join (missingVars , ", " )),
277
- )
278
- setNullMissingVariableValues (inputVars , missingVars )
279
- }
272
+ p .setFallbackValuesForMissingVars (inputVars , blocks )
280
273
}
281
274
282
275
modulesMetadata , metadataPath , err := loadModuleMetadata (p .moduleFS , p .projectRoot )
@@ -314,25 +307,54 @@ func (p *Parser) Load(ctx context.Context) (*evaluator, error) {
314
307
), nil
315
308
}
316
309
317
- func missingVariableValues (blocks terraform.Blocks , inputVars map [string ]cty.Value ) []string {
318
- var missing []string
310
+ func missingVariableValues (blocks terraform.Blocks , inputVars map [string ]cty.Value ) []* terraform. Block {
311
+ var missing []* terraform. Block
319
312
for _ , varBlock := range blocks .OfType ("variable" ) {
320
313
if varBlock .GetAttribute ("default" ) == nil {
321
314
if _ , ok := inputVars [varBlock .TypeLabel ()]; ! ok {
322
- missing = append (missing , varBlock . TypeLabel () )
315
+ missing = append (missing , varBlock )
323
316
}
324
317
}
325
318
}
326
319
327
320
return missing
328
321
}
329
322
330
- // Set null values for missing variables, to allow expressions using them to be
323
+ // Set fallback values for missing variables, to allow expressions using them to be
331
324
// still be possibly evaluated to a value different than null.
332
- func setNullMissingVariableValues (inputVars map [string ]cty.Value , missingVars []string ) {
333
- for _ , missingVar := range missingVars {
334
- inputVars [missingVar ] = cty .NullVal (cty .DynamicPseudoType )
325
+ func (p * Parser ) setFallbackValuesForMissingVars (inputVars map [string ]cty.Value , blocks []* terraform.Block ) {
326
+ varBlocks := missingVariableValues (blocks , inputVars )
327
+ if len (varBlocks ) == 0 {
328
+ return
329
+ }
330
+
331
+ missingVars := make ([]string , 0 , len (varBlocks ))
332
+ for _ , block := range varBlocks {
333
+ varType := inputVariableType (block )
334
+ if varType != cty .NilType {
335
+ inputVars [block .TypeLabel ()] = cty .UnknownVal (varType )
336
+ } else {
337
+ inputVars [block .TypeLabel ()] = cty .DynamicVal
338
+ }
339
+ missingVars = append (missingVars , block .TypeLabel ())
340
+ }
341
+
342
+ p .logger .Warn (
343
+ "Variable values were not found in the environment or variable files. Evaluating may not work correctly." ,
344
+ log .String ("variables" , strings .Join (missingVars , ", " )),
345
+ )
346
+ }
347
+
348
+ func inputVariableType (b * terraform.Block ) cty.Type {
349
+ typeAttr , exists := b .Attributes ()["type" ]
350
+ if ! exists {
351
+ return cty .NilType
352
+ }
353
+ ty , _ , err := typeAttr .DecodeVarType ()
354
+ if err != nil {
355
+ return cty .NilType
335
356
}
357
+ return ty
336
358
}
337
359
338
360
func (p * Parser ) EvaluateAll (ctx context.Context ) (terraform.Modules , cty.Value , error ) {
0 commit comments