// execute parses and executes a template using vars. func execute(s string, vars map[string]interface{}) (string, error) { root, err := hil.Parse(s) if err != nil { return "", err } varmap := make(map[string]ast.Variable) for k, v := range vars { // As far as I can tell, v is always a string. // If it's not, tell the user gracefully. s, ok := v.(string) if !ok { return "", fmt.Errorf("unexpected type for variable %q: %T", k, v) } // Store the defaults (string and value) var val interface{} = s typ := ast.TypeString // If we can parse a float, then use that if v, err := strconv.ParseFloat(s, 64); err == nil { val = v typ = ast.TypeFloat } varmap[k] = ast.Variable{ Value: val, Type: typ, } } cfg := hil.EvalConfig{ GlobalScope: &ast.BasicScope{ VarMap: varmap, FuncMap: config.Funcs(), }, } result, err := hil.Eval(root, &cfg) if err != nil { return "", err } if result.Type != hil.TypeString { return "", fmt.Errorf("unexpected output hil.Type: %v", result.Type) } return result.Value.(string), nil }
// execute parses and executes a template using vars. func execute(s string, vars map[string]interface{}) (string, error) { root, err := hil.Parse(s) if err != nil { return "", err } varmap := make(map[string]ast.Variable) for k, v := range vars { // As far as I can tell, v is always a string. // If it's not, tell the user gracefully. s, ok := v.(string) if !ok { return "", fmt.Errorf("unexpected type for variable %q: %T", k, v) } varmap[k] = ast.Variable{ Value: s, Type: ast.TypeString, } } cfg := hil.EvalConfig{ GlobalScope: &ast.BasicScope{ VarMap: varmap, FuncMap: config.Funcs(), }, } result, err := hil.Eval(root, &cfg) if err != nil { return "", err } if result.Type != hil.TypeString { return "", fmt.Errorf("unexpected output hil.Type: %v", result.Type) } return result.Value.(string), nil }
func init() { if _, ok := config.Funcs()["file"]; ok { panic("file interpolation function exists") } }