internal/utils/inspect_terraform.go (47 lines of code) (raw):
package utils
import (
"fmt"
"os"
"path/filepath"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/hcl/v2/hclsyntax"
)
type TerraformBlockDetail struct {
BackendType string
}
// InspecTerraformBlock inspects the terraform block by interating the top level .tf files.
// This function assumes the dir is a valid terraform workspace, which means there is at most one terraform block defined.
func InspecTerraformBlock(dir string) (*TerraformBlockDetail, error) {
entries, err := os.ReadDir(dir)
if err != nil {
return nil, fmt.Errorf("reading directory %s: %v", dir, err)
}
for _, entry := range entries {
if entry.IsDir() {
continue
}
if filepath.Ext(entry.Name()) != ".tf" {
continue
}
// #nosec G304
b, err := os.ReadFile(filepath.Join(dir, entry.Name()))
if err != nil {
return nil, fmt.Errorf("reading file %s: %v", entry.Name(), err)
}
f, diags := hclsyntax.ParseConfig(b, entry.Name(), hcl.InitialPos)
if diags.HasErrors() {
return nil, fmt.Errorf("parsing file %s: %v", entry.Name(), diags.Error())
}
for _, block := range f.Body.(*hclsyntax.Body).Blocks {
if block.Type != "terraform" {
continue
}
var detail TerraformBlockDetail
for _, block := range block.Body.Blocks {
switch block.Type {
case "backend":
detail.BackendType = block.Labels[0]
}
}
return &detail, nil
}
}
return nil, nil
}