github.com/Azure/tflint-ruleset-azurerm-ext@v0.6.0/rules/azurerm_arg_order.go (about) 1 package rules 2 3 import ( 4 "fmt" 5 "github.com/terraform-linters/tflint-plugin-sdk/logger" 6 7 "github.com/Azure/tflint-ruleset-azurerm-ext/project" 8 "github.com/ahmetb/go-linq/v3" 9 "github.com/hashicorp/go-multierror" 10 "github.com/hashicorp/hcl/v2" 11 "github.com/hashicorp/hcl/v2/hclsyntax" 12 "github.com/lonegunmanb/terraform-azurerm-schema/v3/generated" 13 "github.com/terraform-linters/tflint-plugin-sdk/tflint" 14 ) 15 16 var _ tflint.Rule = new(AzurermArgOrderRule) 17 18 // AzurermArgOrderRule checks whether the arguments in a block are sorted in azure doc order 19 type AzurermArgOrderRule struct { 20 tflint.DefaultRule 21 } 22 23 func (r *AzurermArgOrderRule) Enabled() bool { 24 return false 25 } 26 27 func (r *AzurermArgOrderRule) Severity() tflint.Severity { 28 return tflint.NOTICE 29 } 30 31 func (r *AzurermArgOrderRule) Check(runner tflint.Runner) error { 32 return Check(runner, r.CheckFile) 33 } 34 35 func (r *AzurermArgOrderRule) Link() string { 36 return project.ReferenceLink(r.Name()) 37 } 38 39 // NewAzurermArgOrderRule returns a new rule 40 func NewAzurermArgOrderRule() *AzurermArgOrderRule { 41 return &AzurermArgOrderRule{} 42 } 43 44 // Name returns the rule name 45 func (r *AzurermArgOrderRule) Name() string { 46 return "azurerm_arg_order" 47 } 48 49 // CheckFile checks whether the arguments in a block are sorted in codex order 50 func (r *AzurermArgOrderRule) CheckFile(runner tflint.Runner, file *hcl.File) error { 51 body, ok := file.Body.(*hclsyntax.Body) 52 if !ok { 53 logger.Debug("skip azurerm_arg_order since it's not hcl file") 54 return nil 55 } 56 blocks := body.Blocks 57 var err error 58 for _, block := range blocks { 59 var subErr error 60 typeWanted := linq.From([]string{"provider", "resource", "data"}).Contains(block.Type) 61 if !typeWanted { 62 continue 63 } 64 isAzProviderBlock := block.Type == "provider" && block.Labels[0] == "azurerm" 65 collection := generated.Resources 66 if block.Type == "data" { 67 collection = generated.DataSources 68 } 69 _, isAzBlock := collection[block.Labels[0]] 70 if typeWanted && (isAzProviderBlock || isAzBlock) { 71 subErr = r.visitAzBlock(runner, block) 72 } 73 if subErr != nil { 74 err = multierror.Append(err, subErr) 75 } 76 } 77 return err 78 } 79 80 func (r *AzurermArgOrderRule) visitAzBlock(runner tflint.Runner, azBlock *hclsyntax.Block) error { 81 emitter := func(block Block) error { 82 return runner.EmitIssue( 83 r, 84 fmt.Sprintf("Arguments are expected to be sorted in following order:\n%s", block.ToString()), 85 block.DefRange(), 86 ) 87 } 88 file, _ := runner.GetFile(azBlock.Range().Filename) 89 b := BuildResourceBlock(azBlock, file, emitter) 90 return b.CheckBlock() 91 }