rules/terraform_output_separate.go (69 lines of code) (raw):

package rules import ( "github.com/Azure/tflint-ruleset-basic-ext/project" "github.com/hashicorp/go-multierror" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/terraform-linters/tflint-plugin-sdk/logger" "github.com/terraform-linters/tflint-plugin-sdk/tflint" ) // TerraformOutputSeparateRule checks whether the outputs are separated from other types of blocks type TerraformOutputSeparateRule struct { tflint.DefaultRule } // NewTerraformOutputSeparateRule returns a new rule func NewTerraformOutputSeparateRule() *TerraformOutputSeparateRule { return &TerraformOutputSeparateRule{} } // Name returns the rule name func (r *TerraformOutputSeparateRule) Name() string { return "terraform_output_separate" } // Enabled returns whether the rule is enabled by default func (r *TerraformOutputSeparateRule) Enabled() bool { return false } // Severity returns the rule severity func (r *TerraformOutputSeparateRule) Severity() tflint.Severity { return tflint.NOTICE } // Link returns the rule reference link func (r *TerraformOutputSeparateRule) Link() string { return project.ReferenceLink(r.Name()) } // Check checks whether the variables are separated from other types of blocks func (r *TerraformOutputSeparateRule) Check(runner tflint.Runner) error { files, err := runner.GetFiles() if err != nil { return err } for _, file := range files { if subErr := r.checkOutputSeparate(runner, file); subErr != nil { err = multierror.Append(err, subErr) } } return err } func (r *TerraformOutputSeparateRule) checkOutputSeparate(runner tflint.Runner, file *hcl.File) error { body, ok := file.Body.(*hclsyntax.Body) if !ok { logger.Debug("skip terraform_output_separate check since it's not hcl file") return nil } blocks := body.Blocks var firstNonOutputBlockRange *hcl.Range outputDefined := false for _, block := range blocks { switch block.Type { case "output": { outputDefined = true } default: if firstNonOutputBlockRange == nil { firstNonOutputBlockRange = ref(block.DefRange()) } } } if outputDefined && firstNonOutputBlockRange != nil { return runner.EmitIssue( r, "Putting outputs and other types of blocks in the same file is not recommended", *firstNonOutputBlockRange, ) } return nil }