From c8795b85657848c0c6614d16ab7ba172ed550546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20F=2E=20Romaniello?= Date: Wed, 27 Jan 2016 12:36:31 -0300 Subject: [PATCH] Add signum interpolation function This function returns -1 for negative numbers, 0 for 0 and 1 for positive numbers. Useful when you need to set a value for the first resource and a different value for the rest of the resources. Example: `${element(split(",", var.r53_failover_policy), signum(count.index))}` --- config/interpolate_funcs.go | 20 +++++++++++ config/interpolate_funcs_test.go | 36 +++++++++++++++++++ .../docs/configuration/interpolation.html.md | 5 +++ 3 files changed, 61 insertions(+) diff --git a/config/interpolate_funcs.go b/config/interpolate_funcs.go index a0ceeeec4..b51c18037 100644 --- a/config/interpolate_funcs.go +++ b/config/interpolate_funcs.go @@ -38,6 +38,7 @@ func Funcs() map[string]ast.Function { "length": interpolationFuncLength(), "lower": interpolationFuncLower(), "replace": interpolationFuncReplace(), + "signum": interpolationFuncSignum(), "split": interpolationFuncSplit(), "sha1": interpolationFuncSha1(), "sha256": interpolationFuncSha256(), @@ -403,6 +404,25 @@ func interpolationFuncLength() ast.Function { } } +func interpolationFuncSignum() ast.Function { + return ast.Function{ + ArgTypes: []ast.Type{ast.TypeInt}, + ReturnType: ast.TypeInt, + Variadic: false, + Callback: func(args []interface{}) (interface{}, error) { + num := args[0].(int) + switch { + case num < 0: + return -1, nil + case num > 0: + return +1, nil + default: + return 0, nil + } + }, + } +} + // interpolationFuncSplit implements the "split" function that allows // strings to split into multi-variable values func interpolationFuncSplit() ast.Function { diff --git a/config/interpolate_funcs_test.go b/config/interpolate_funcs_test.go index 78139aa2d..6bd7b3035 100644 --- a/config/interpolate_funcs_test.go +++ b/config/interpolate_funcs_test.go @@ -543,6 +543,42 @@ func TestInterpolateFuncLength(t *testing.T) { }) } +func TestInterpolateFuncSignum(t *testing.T) { + testFunction(t, testFunctionConfig{ + Cases: []testFunctionCase{ + { + `${signum()}`, + nil, + true, + }, + + { + `${signum("")}`, + nil, + true, + }, + + { + `${signum(0)}`, + "0", + false, + }, + + { + `${signum(15)}`, + "1", + false, + }, + + { + `${signum(-29)}`, + "-1", + false, + }, + }, + }) +} + func TestInterpolateFuncSplit(t *testing.T) { testFunction(t, testFunctionConfig{ Cases: []testFunctionCase{ diff --git a/website/source/docs/configuration/interpolation.html.md b/website/source/docs/configuration/interpolation.html.md index 77c40e59e..07f369432 100644 --- a/website/source/docs/configuration/interpolation.html.md +++ b/website/source/docs/configuration/interpolation.html.md @@ -168,6 +168,11 @@ The supported built-in functions are: `n` is the index or name of the subcapture. If using a regular expression, the syntax conforms to the [re2 regular expression syntax](https://code.google.com/p/re2/wiki/Syntax). + * `signum(int)` - Returns -1 for negative numbers, 0 for 0 and 1 for positive numbers. + This function is useful when you need to set a value for the first resource and + a different value for the rest of the resources. + Example: `element(split(",", var.r53_failover_policy), signum(count.index))` + * `split(delim, string)` - Splits the string previously created by `join` back into a list. This is useful for pushing lists through module outputs since they currently only support string values. Depending on the