func()

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
}