From a2dff8ed1e73ca793d60016ce80c39d3d6b4f0e2 Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Mon, 9 Nov 2020 15:02:21 -0500 Subject: [PATCH] Parse variable files --- jobspec2/parse.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/jobspec2/parse.go b/jobspec2/parse.go index 1f1282cd4..669d56bc4 100644 --- a/jobspec2/parse.go +++ b/jobspec2/parse.go @@ -97,6 +97,11 @@ func decode(c *jobConfig) error { file, diags = hcljson.Parse(pc.Body, pc.Path) } + + parsedVarFiles, mdiags := parseVarFiles(pc.VarFiles) + pc.parsedVarFiles = parsedVarFiles + diags = append(diags, mdiags...) + if diags.HasErrors() { return diags } @@ -118,6 +123,41 @@ func decode(c *jobConfig) error { return nil } +func parseVarFiles(paths []string) ([]*hcl.File, hcl.Diagnostics) { + if len(paths) == 0 { + return nil, nil + } + + files := make([]*hcl.File, 0, len(paths)) + var diags hcl.Diagnostics + + for _, p := range paths { + body, err := ioutil.ReadFile(p) + if err != nil { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Failed to read file", + Detail: fmt.Sprintf("failed to read %q: %v", p, err), + }) + continue + } + + var file *hcl.File + var mdiags hcl.Diagnostics + if !isJSON(body) { + file, mdiags = hclsyntax.ParseConfig(body, p, hcl.Pos{Line: 1, Column: 1}) + } else { + file, mdiags = hcljson.Parse(body, p) + + } + + files = append(files, file) + diags = append(diags, mdiags...) + } + + return files, diags +} + func isJSON(src []byte) bool { for _, c := range src { if c == ' ' {