1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
package config
import (
"github.com/hashicorp/hcl/v2"
"github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/function"
"github.com/zclconf/go-cty/cty/gocty"
"github.com/hashicorp/vagrant/internal/config/funcs"
)
// EvalContext returns the common eval context to use for parsing all
// configurations. This should always be available for all config types.
//
// The pwd param is the directory to use as a working directory
// for determining things like relative paths. This should be considered
// the pwd over the actual process pwd.
func EvalContext(parent *hcl.EvalContext, pwd string) *hcl.EvalContext {
// NewChild works even with parent == nil so this is valid
result := parent.NewChild()
// Start with our HCL stdlib
result.Functions = funcs.Stdlib()
// add functions to our context
addFuncs := func(fs map[string]function.Function) {
for k, v := range fs {
result.Functions[k] = v
}
}
// Add some of our functions
addFuncs(funcs.VCSGitFuncs(pwd))
addFuncs(funcs.Filesystem(pwd))
addFuncs(funcs.Encoding())
return result
}
// appendContext makes child a child of parent and returns the new context.
// If child is nil this returns parent.
func appendContext(parent, child *hcl.EvalContext) *hcl.EvalContext {
if child == nil {
return parent
}
newChild := parent.NewChild()
newChild.Variables = child.Variables
newChild.Functions = child.Functions
return newChild
}
// addPathValue adds the "path" variable to the context.
func addPathValue(ctx *hcl.EvalContext, v map[string]string) {
value, err := gocty.ToCtyValue(v, cty.Map(cty.String))
if err != nil {
// map[string]string conversion should never fail
panic(err)
}
if ctx.Variables == nil {
ctx.Variables = map[string]cty.Value{}
}
ctx.Variables["path"] = value
}
|