rules/azurerm_arg_order.go (75 lines of code) (raw):

package rules import ( "fmt" "github.com/terraform-linters/tflint-plugin-sdk/logger" "github.com/Azure/tflint-ruleset-azurerm-ext/project" "github.com/ahmetb/go-linq/v3" "github.com/hashicorp/go-multierror" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/lonegunmanb/terraform-azurerm-schema/v4/generated" "github.com/terraform-linters/tflint-plugin-sdk/tflint" ) var _ tflint.Rule = new(AzurermArgOrderRule) // AzurermArgOrderRule checks whether the arguments in a block are sorted in azure doc order type AzurermArgOrderRule struct { tflint.DefaultRule } func (r *AzurermArgOrderRule) Enabled() bool { return false } func (r *AzurermArgOrderRule) Severity() tflint.Severity { return tflint.NOTICE } func (r *AzurermArgOrderRule) Check(runner tflint.Runner) error { return Check(runner, r.CheckFile) } func (r *AzurermArgOrderRule) Link() string { return project.ReferenceLink(r.Name()) } // NewAzurermArgOrderRule returns a new rule func NewAzurermArgOrderRule() *AzurermArgOrderRule { return &AzurermArgOrderRule{} } // Name returns the rule name func (r *AzurermArgOrderRule) Name() string { return "azurerm_arg_order" } // CheckFile checks whether the arguments in a block are sorted in codex order func (r *AzurermArgOrderRule) CheckFile(runner tflint.Runner, file *hcl.File) error { body, ok := file.Body.(*hclsyntax.Body) if !ok { logger.Debug("skip azurerm_arg_order since it's not hcl file") return nil } blocks := body.Blocks var err error for _, block := range blocks { var subErr error typeWanted := linq.From([]string{"provider", "resource", "data"}).Contains(block.Type) if !typeWanted { continue } isAzProviderBlock := block.Type == "provider" && block.Labels[0] == "azurerm" collection := generated.Resources if block.Type == "data" { collection = generated.DataSources } _, isAzBlock := collection[block.Labels[0]] if typeWanted && (isAzProviderBlock || isAzBlock) { subErr = r.visitAzBlock(runner, block) } if subErr != nil { err = multierror.Append(err, subErr) } } return err } func (r *AzurermArgOrderRule) visitAzBlock(runner tflint.Runner, azBlock *hclsyntax.Block) error { emitter := func(block Block) error { return runner.EmitIssue( r, fmt.Sprintf("Arguments are expected to be sorted in following order:\n%s", block.ToString()), block.DefRange(), ) } file, _ := runner.GetFile(azBlock.Range().Filename) b := BuildResourceBlock(azBlock, file, emitter) return b.CheckBlock() }