in rules/terraform_required_providers_declaration.go [89:143]
func (r *TerraformRequiredProvidersDeclarationRule) checkRequiredProvidersArgOrder(runner tflint.Runner, providerBlock *hclsyntax.Block) error {
file, _ := runner.GetFile(providerBlock.Range().Filename)
var providerNames []string
providerParamTxts := make(map[string]string)
providerParamIssues := helper.Issues{}
providers := providerBlock.Body.Attributes
for _, config := range attributesByLines(providers) {
sortedMap, sorted := PrintSortedAttrTxt(file.Bytes, config)
name := config.Name
providerParamTxts[name] = sortedMap
providerNames = append(providerNames, name)
if !sorted {
providerParamIssues = append(providerParamIssues, &helper.Issue{
Rule: r,
Message: fmt.Sprintf("Parameters of provider `%s` are expected to be sorted as follows:\n%s", name, sortedMap),
Range: config.NameRange,
})
}
}
sort.Slice(providerNames, func(x, y int) bool {
providerX := providers[providerNames[x]]
providerY := providers[providerNames[y]]
if providerX.Range().Start.Line == providerY.Range().Start.Line {
return providerX.Range().Start.Column < providerY.Range().Start.Column
}
return providerX.Range().Start.Line < providerY.Range().Start.Line
})
if !sort.StringsAreSorted(providerNames) {
sort.Strings(providerNames)
var sortedProviderParamTxts []string
for _, providerName := range providerNames {
sortedProviderParamTxts = append(sortedProviderParamTxts, providerParamTxts[providerName])
}
sortedProviderParamTxt := strings.Join(sortedProviderParamTxts, "\n")
var sortedRequiredProviderTxt string
if RemoveSpaceAndLine(sortedProviderParamTxt) == "" {
sortedRequiredProviderTxt = fmt.Sprintf("%s {}", providerBlock.Type)
} else {
sortedRequiredProviderTxt = fmt.Sprintf("%s {\n%s\n}", providerBlock.Type, sortedProviderParamTxt)
}
sortedRequiredProviderTxt = string(hclwrite.Format([]byte(sortedRequiredProviderTxt)))
return runner.EmitIssue(
r,
fmt.Sprintf("The arguments of `required_providers` are expected to be sorted as follows:\n%s", sortedRequiredProviderTxt),
providerBlock.DefRange(),
)
}
var err error
for _, issue := range providerParamIssues {
if subErr := runner.EmitIssue(issue.Rule, issue.Message, issue.Range); subErr != nil {
err = multierror.Append(err, subErr)
}
}
return err
}