github.com/paultyng/terraform@v0.6.11-0.20180227224804-66ff8f8bed40/configs/module_call.go (about)

     1  package configs
     2  
     3  import (
     4  	"github.com/hashicorp/hcl2/gohcl"
     5  	"github.com/hashicorp/hcl2/hcl"
     6  	"github.com/hashicorp/hcl2/hcl/hclsyntax"
     7  )
     8  
     9  // ModuleCall represents a "module" block in a module or file.
    10  type ModuleCall struct {
    11  	Name string
    12  
    13  	SourceAddr      string
    14  	SourceAddrRange hcl.Range
    15  	SourceSet       bool
    16  
    17  	Config hcl.Body
    18  
    19  	Version VersionConstraint
    20  
    21  	Count   hcl.Expression
    22  	ForEach hcl.Expression
    23  
    24  	DependsOn []hcl.Traversal
    25  
    26  	DeclRange hcl.Range
    27  }
    28  
    29  func decodeModuleBlock(block *hcl.Block, override bool) (*ModuleCall, hcl.Diagnostics) {
    30  	mc := &ModuleCall{
    31  		Name:      block.Labels[0],
    32  		DeclRange: block.DefRange,
    33  	}
    34  
    35  	schema := moduleBlockSchema
    36  	if override {
    37  		schema = schemaForOverrides(schema)
    38  	}
    39  
    40  	content, remain, diags := block.Body.PartialContent(schema)
    41  	mc.Config = remain
    42  
    43  	if !hclsyntax.ValidIdentifier(mc.Name) {
    44  		diags = append(diags, &hcl.Diagnostic{
    45  			Severity: hcl.DiagError,
    46  			Summary:  "Invalid module instance name",
    47  			Detail:   badIdentifierDetail,
    48  			Subject:  &block.LabelRanges[0],
    49  		})
    50  	}
    51  
    52  	if attr, exists := content.Attributes["source"]; exists {
    53  		valDiags := gohcl.DecodeExpression(attr.Expr, nil, &mc.SourceAddr)
    54  		diags = append(diags, valDiags...)
    55  		mc.SourceAddrRange = attr.Expr.Range()
    56  		mc.SourceSet = true
    57  	}
    58  
    59  	if attr, exists := content.Attributes["version"]; exists {
    60  		var versionDiags hcl.Diagnostics
    61  		mc.Version, versionDiags = decodeVersionConstraint(attr)
    62  		diags = append(diags, versionDiags...)
    63  	}
    64  
    65  	if attr, exists := content.Attributes["count"]; exists {
    66  		mc.Count = attr.Expr
    67  	}
    68  
    69  	if attr, exists := content.Attributes["for_each"]; exists {
    70  		mc.ForEach = attr.Expr
    71  	}
    72  
    73  	if attr, exists := content.Attributes["depends_on"]; exists {
    74  		deps, depsDiags := decodeDependsOn(attr)
    75  		diags = append(diags, depsDiags...)
    76  		mc.DependsOn = append(mc.DependsOn, deps...)
    77  	}
    78  
    79  	return mc, diags
    80  }
    81  
    82  var moduleBlockSchema = &hcl.BodySchema{
    83  	Attributes: []hcl.AttributeSchema{
    84  		{
    85  			Name:     "source",
    86  			Required: true,
    87  		},
    88  		{
    89  			Name: "version",
    90  		},
    91  		{
    92  			Name: "count",
    93  		},
    94  		{
    95  			Name: "for_each",
    96  		},
    97  		{
    98  			Name: "depends_on",
    99  		},
   100  	},
   101  }