packer-cn/hcl2template/utils.go

91 lines
2.1 KiB
Go

package hcl2template
import (
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/hashicorp/hcl/v2"
)
func warningErrorsToDiags(block *hcl.Block, warnings []string, err error) hcl.Diagnostics {
var diags hcl.Diagnostics
for _, warning := range warnings {
diags = append(diags, &hcl.Diagnostic{
Summary: warning,
Subject: &block.DefRange,
Severity: hcl.DiagWarning,
})
}
if err != nil {
diags = append(diags, &hcl.Diagnostic{
Summary: err.Error(),
Subject: &block.DefRange,
Severity: hcl.DiagError,
})
}
return diags
}
func isDir(name string) (bool, error) {
s, err := os.Stat(name)
if err != nil {
return false, err
}
return s.IsDir(), nil
}
func GetHCL2Files(filename string) (hclFiles, jsonFiles []string, diags hcl.Diagnostics) {
isDir, err := isDir(filename)
if err != nil {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Cannot tell wether " + filename + " is a directory",
Detail: err.Error(),
})
return nil, nil, diags
}
if !isDir {
if strings.HasSuffix(filename, hcl2JsonFileExt) {
return nil, []string{filename}, diags
}
if strings.HasSuffix(filename, hcl2FileExt) {
return []string{filename}, nil, diags
}
}
fileInfos, err := ioutil.ReadDir(filename)
if err != nil {
diag := &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Cannot read hcl directory",
Detail: err.Error(),
}
diags = append(diags, diag)
return nil, nil, diags
}
for _, fileInfo := range fileInfos {
if fileInfo.IsDir() {
continue
}
filename := filepath.Join(filename, fileInfo.Name())
if strings.HasSuffix(filename, hcl2FileExt) {
hclFiles = append(hclFiles, filename)
} else if strings.HasSuffix(filename, hcl2JsonFileExt) {
jsonFiles = append(jsonFiles, filename)
}
}
if len(hclFiles)+len(jsonFiles) == 0 {
diags = append(diags, &hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Could not find any config file in " + filename,
Detail: "A config file must be suffixed with `.pkr.hcl` or " +
"`.pkr.json`. A folder can be referenced.",
})
}
return hclFiles, jsonFiles, diags
}