Skip to content

Commit

Permalink
Expose configuration_aliases from required_providers
Browse files Browse the repository at this point in the history
  • Loading branch information
radeksimko committed Mar 11, 2021
1 parent 4fd17a0 commit e23e4a7
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 5 deletions.
75 changes: 71 additions & 4 deletions tfconfig/provider_ref.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/hcl/v2/gohcl"
"github.com/hashicorp/hcl/v2/hclsyntax"
"github.com/zclconf/go-cty/cty"
)

Expand All @@ -17,8 +18,9 @@ type ProviderRef struct {
}

type ProviderRequirement struct {
Source string `json:"source,omitempty"`
VersionConstraints []string `json:"version_constraints,omitempty"`
Source string `json:"source,omitempty"`
VersionConstraints []string `json:"version_constraints,omitempty"`
ConfigurationAliases []ProviderRef `json:"aliases,omitempty"`
}

func decodeRequiredProvidersBlock(block *hcl.Block) (map[string]*ProviderRequirement, hcl.Diagnostics) {
Expand Down Expand Up @@ -85,8 +87,8 @@ func decodeRequiredProvidersBlock(block *hcl.Block) (map[string]*ProviderRequire
}

case "source":
source, err := kv.Value.Value(nil)
if err != nil || !source.Type().Equals(cty.String) {
source, valDiags := kv.Value.Value(nil)
if valDiags.HasErrors() || !source.Type().Equals(cty.String) {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unsuitable value type",
Expand All @@ -99,6 +101,13 @@ func decodeRequiredProvidersBlock(block *hcl.Block) (map[string]*ProviderRequire
if !source.IsNull() {
pr.Source = source.AsString()
}
case "configuration_aliases":
aliases, valDiags := decodeConfigurationAliases(kv.Value)
if valDiags.HasErrors() {
diags = append(diags, valDiags...)
continue
}
pr.ConfigurationAliases = append(pr.ConfigurationAliases, aliases...)
}

reqs[name] = &pr
Expand All @@ -107,3 +116,61 @@ func decodeRequiredProvidersBlock(block *hcl.Block) (map[string]*ProviderRequire

return reqs, diags
}

func decodeConfigurationAliases(value hcl.Expression) ([]ProviderRef, hcl.Diagnostics) {
aliases := make([]ProviderRef, 0)
var diags hcl.Diagnostics

tuple, ok := value.(*hclsyntax.TupleConsExpr)
if !ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unsuitable value type",
Detail: "Unsuitable value: tuple required",
Subject: value.Range().Ptr(),
})
return aliases, diags
}

for _, expr := range tuple.Exprs {
alias, ok := expr.(*hclsyntax.ScopeTraversalExpr)
if !ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unsuitable value type for alias",
Detail: "Unsuitable type of alias: traversal required",
Subject: expr.Range().Ptr(),
})
continue
}

traversal := alias.AsTraversal()
if len(traversal) != 2 {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unexpected alias identification",
Detail: "Expected identification in localname.alias format",
Subject: expr.Range().Ptr(),
})
continue
}

tAttr, ok := traversal[1].(hcl.TraverseAttr)
if !ok {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Unexpected alias identification",
Detail: "Expected second part of identification to be the alias (string)",
Subject: expr.Range().Ptr(),
})
continue
}

aliases = append(aliases, ProviderRef{
Name: traversal.RootName(),
Alias: tAttr.Name,
})
}

return aliases, diags
}
6 changes: 5 additions & 1 deletion tfconfig/testdata/provider-aliases/provider-aliases.out.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@
"required_providers": {
"bar": {},
"baz": {},
"bleep": {},
"bleep": {
"aliases": [
{"name": "bleep", "alias": "bloop"}
]
},
"empty": {},
"foo": {}
},
Expand Down

0 comments on commit e23e4a7

Please sign in to comment.