github.com/paultyng/terraform@v0.6.11-0.20180227224804-66ff8f8bed40/configs/provider.go (about) 1 package configs 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/hcl2/gohcl" 7 "github.com/hashicorp/hcl2/hcl" 8 "github.com/hashicorp/hcl2/hcl/hclsyntax" 9 ) 10 11 // Provider represents a "provider" block in a module or file. A provider 12 // block is a provider configuration, and there can be zero or more 13 // configurations for each actual provider. 14 type Provider struct { 15 Name string 16 NameRange hcl.Range 17 Alias string 18 AliasRange *hcl.Range // nil if no alias set 19 20 Version VersionConstraint 21 22 Config hcl.Body 23 24 DeclRange hcl.Range 25 } 26 27 func decodeProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) { 28 content, config, diags := block.Body.PartialContent(providerBlockSchema) 29 30 provider := &Provider{ 31 Name: block.Labels[0], 32 NameRange: block.LabelRanges[0], 33 Config: config, 34 DeclRange: block.DefRange, 35 } 36 37 if attr, exists := content.Attributes["alias"]; exists { 38 valDiags := gohcl.DecodeExpression(attr.Expr, nil, &provider.Alias) 39 diags = append(diags, valDiags...) 40 provider.AliasRange = attr.Expr.Range().Ptr() 41 42 if !hclsyntax.ValidIdentifier(provider.Alias) { 43 diags = append(diags, &hcl.Diagnostic{ 44 Severity: hcl.DiagError, 45 Summary: "Invalid provider configuration alias", 46 Detail: fmt.Sprintf("An alias must be a valid name. %s", badIdentifierDetail), 47 }) 48 } 49 } 50 51 if attr, exists := content.Attributes["version"]; exists { 52 var versionDiags hcl.Diagnostics 53 provider.Version, versionDiags = decodeVersionConstraint(attr) 54 diags = append(diags, versionDiags...) 55 } 56 57 return provider, diags 58 } 59 60 func (p *Provider) moduleUniqueKey() string { 61 if p.Alias != "" { 62 return fmt.Sprintf("%s.%s", p.Name, p.Alias) 63 } 64 return p.Name 65 } 66 67 // ProviderRequirement represents a declaration of a dependency on a particular 68 // provider version without actually configuring that provider. This is used in 69 // child modules that expect a provider to be passed in from their parent. 70 type ProviderRequirement struct { 71 Name string 72 Requirement VersionConstraint 73 } 74 75 func decodeRequiredProvidersBlock(block *hcl.Block) ([]*ProviderRequirement, hcl.Diagnostics) { 76 attrs, diags := block.Body.JustAttributes() 77 var reqs []*ProviderRequirement 78 for name, attr := range attrs { 79 req, reqDiags := decodeVersionConstraint(attr) 80 diags = append(diags, reqDiags...) 81 if !diags.HasErrors() { 82 reqs = append(reqs, &ProviderRequirement{ 83 Name: name, 84 Requirement: req, 85 }) 86 } 87 } 88 return reqs, diags 89 } 90 91 var providerBlockSchema = &hcl.BodySchema{ 92 Attributes: []hcl.AttributeSchema{ 93 { 94 Name: "alias", 95 }, 96 { 97 Name: "version", 98 }, 99 }, 100 }