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  }