2019-01-09 02:42:48 +01:00
|
|
|
package tfconfig
|
|
|
|
|
2020-01-10 17:54:53 +01:00
|
|
|
import (
|
|
|
|
"github.com/hashicorp/hcl/v2"
|
|
|
|
"github.com/hashicorp/hcl/v2/gohcl"
|
|
|
|
"github.com/zclconf/go-cty/cty/gocty"
|
|
|
|
)
|
|
|
|
|
2019-01-09 02:42:48 +01:00
|
|
|
// ProviderRef is a reference to a provider configuration within a module.
|
|
|
|
// It represents the contents of a "provider" argument in a resource, or
|
|
|
|
// a value in the "providers" map for a module call.
|
|
|
|
type ProviderRef struct {
|
|
|
|
Name string `json:"name"`
|
|
|
|
Alias string `json:"alias,omitempty"` // Empty if the default provider configuration is referenced
|
|
|
|
}
|
2020-01-10 17:54:53 +01:00
|
|
|
|
|
|
|
type ProviderRequirement struct {
|
|
|
|
Source string `json:"source,omitempty"`
|
|
|
|
VersionConstraints []string `json:"version_constraints,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func decodeRequiredProvidersBlock(block *hcl.Block) (map[string]*ProviderRequirement, hcl.Diagnostics) {
|
|
|
|
attrs, diags := block.Body.JustAttributes()
|
|
|
|
reqs := make(map[string]*ProviderRequirement)
|
|
|
|
for name, attr := range attrs {
|
|
|
|
expr, err := attr.Expr.Value(nil)
|
|
|
|
if err != nil {
|
|
|
|
diags = append(diags, err...)
|
|
|
|
}
|
|
|
|
|
|
|
|
switch {
|
|
|
|
case expr.Type().IsPrimitiveType():
|
|
|
|
var version string
|
|
|
|
valDiags := gohcl.DecodeExpression(attr.Expr, nil, &version)
|
|
|
|
diags = append(diags, valDiags...)
|
|
|
|
if !valDiags.HasErrors() {
|
|
|
|
reqs[name] = &ProviderRequirement{
|
|
|
|
VersionConstraints: []string{version},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
case expr.Type().IsObjectType():
|
|
|
|
var pr ProviderRequirement
|
|
|
|
if expr.Type().HasAttribute("version") {
|
|
|
|
var version string
|
|
|
|
err := gocty.FromCtyValue(expr.GetAttr("version"), &version)
|
|
|
|
if err == nil {
|
|
|
|
pr.VersionConstraints = append(pr.VersionConstraints, version)
|
|
|
|
} else {
|
|
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
|
|
Severity: hcl.DiagError,
|
|
|
|
Summary: "Unsuitable value type",
|
|
|
|
Detail: "Unsuitable value: string required",
|
|
|
|
Subject: attr.Expr.Range().Ptr(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if expr.Type().HasAttribute("source") {
|
|
|
|
var source string
|
|
|
|
err := gocty.FromCtyValue(expr.GetAttr("source"), &source)
|
|
|
|
if err == nil {
|
|
|
|
pr.Source = source
|
|
|
|
} else {
|
|
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
|
|
Severity: hcl.DiagError,
|
|
|
|
Summary: "Unsuitable value type",
|
|
|
|
Detail: "Unsuitable value: string required",
|
|
|
|
Subject: attr.Expr.Range().Ptr(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reqs[name] = &pr
|
|
|
|
|
|
|
|
default:
|
|
|
|
diags = append(diags, &hcl.Diagnostic{
|
|
|
|
Severity: hcl.DiagError,
|
|
|
|
Summary: "Unsuitable value type",
|
|
|
|
Detail: "Unsuitable value: string required",
|
|
|
|
Subject: attr.Expr.Range().Ptr(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return reqs, diags
|
|
|
|
}
|