diff --git a/config/interpolate_funcs.go b/config/interpolate_funcs.go index c529adb8d..69e327e37 100644 --- a/config/interpolate_funcs.go +++ b/config/interpolate_funcs.go @@ -19,6 +19,7 @@ func init() { "file": interpolationFuncFile(), "join": interpolationFuncJoin(), "element": interpolationFuncElement(), + "split": interpolationFuncSplit(), } } @@ -78,6 +79,18 @@ func interpolationFuncJoin() ast.Function { } } +// interpolationFuncSplit implements the "split" function that allows +// strings to split into multi-variable values +func interpolationFuncSplit() ast.Function { + return ast.Function{ + ArgTypes: []ast.Type{ast.TypeString, ast.TypeString}, + ReturnType: ast.TypeString, + Callback: func(args []interface{}) (interface{}, error) { + return strings.Replace(args[1].(string), args[0].(string), InterpSplitDelim, -1), nil + }, + } +} + // interpolationFuncLookup implements the "lookup" function that allows // dynamic lookups of map types within a Terraform configuration. func interpolationFuncLookup(vs map[string]ast.Variable) ast.Function { diff --git a/config/interpolate_funcs_test.go b/config/interpolate_funcs_test.go index 1a4a59057..9710852db 100644 --- a/config/interpolate_funcs_test.go +++ b/config/interpolate_funcs_test.go @@ -107,6 +107,33 @@ func TestInterpolateFuncJoin(t *testing.T) { }) } +func TestInterpolateFuncSplit(t *testing.T) { + testFunction(t, testFunctionConfig{ + Cases: []testFunctionCase{ + { + `${split(",")}`, + nil, + true, + }, + + { + `${split(",", "foo")}`, + "foo", + false, + }, + + { + `${split(".", "foo.bar.baz")}`, + fmt.Sprintf( + "foo%sbar%sbaz", + InterpSplitDelim, + InterpSplitDelim), + false, + }, + }, + }) +} + func TestInterpolateFuncLookup(t *testing.T) { testFunction(t, testFunctionConfig{ Vars: map[string]ast.Variable{