about summary refs log tree commit diff
path: root/context/context.go
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2017-06-22T15·01+0200
committerVincent Ambo <tazjin@gmail.com>2017-07-03T12·27+0200
commit9d26c17f13240479ef3e12e9182aca3ac2e61901 (patch)
tree9ead86ab4028e81b4413a63d65908b355ba53e42 /context/context.go
parent68e1e484594aa86a874c6eb2ad328274c5f48dd7 (diff)
feat context: Add ability to import extra variables from files
Kontemplate context specifications can now load extra variables from YAML
or JSON files by specifying a list of files (relative to the context file)
under the `import` key.
Diffstat (limited to 'context/context.go')
-rw-r--r--context/context.go34
1 files changed, 30 insertions, 4 deletions
diff --git a/context/context.go b/context/context.go
index 0dde590556..c812af8b26 100644
--- a/context/context.go
+++ b/context/context.go
@@ -17,10 +17,11 @@ type ResourceSet struct {
 }
 
 type Context struct {
-	Name         string                 `json:"context"`
-	Global       map[string]interface{} `json:"global"`
-	ResourceSets []ResourceSet          `json:"include"`
-	BaseDir      string
+	Name            string                 `json:"context"`
+	Global          map[string]interface{} `json:"global"`
+	ResourceSets    []ResourceSet          `json:"include"`
+	VariableImports []string               `json:"import"`
+	BaseDir         string
 }
 
 type ContextLoadingError struct {
@@ -44,9 +45,34 @@ func LoadContextFromFile(filename string) (*Context, error) {
 	c.BaseDir = path.Dir(filename)
 	c.ResourceSets = loadAllDefaultValues(&c)
 
+	err = c.loadImportedVariables()
+	if err != nil {
+		return nil, meep.New(
+			&ContextLoadingError{Filename: filename},
+			meep.Cause(err),
+		)
+	}
+
 	return &c, nil
 }
 
+// Kontemplate supports specifying additional variable files with the `import` keyword. This function loads those
+// variable files and merges them together with the context's other global variables.
+func (ctx *Context) loadImportedVariables() error {
+	for _, file := range ctx.VariableImports {
+		var importedVars map[string]interface{}
+		err := util.LoadJsonOrYaml(path.Join(ctx.BaseDir, file), &importedVars)
+
+		if err != nil {
+			return err
+		}
+
+		ctx.Global = *util.Merge(&ctx.Global, &importedVars)
+	}
+
+	return nil
+}
+
 // Flattens resource set collections, i.e. resource sets that themselves have an additional 'include' field set.
 // Those will be regarded as a short-hand for including multiple resource sets from a subfolder.
 // See https://github.com/tazjin/kontemplate/issues/9 for more information.