Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add signum interpolation function #4854

Merged
merged 1 commit into from
Feb 7, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions config/interpolate_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func Funcs() map[string]ast.Function {
"length": interpolationFuncLength(),
"lower": interpolationFuncLower(),
"replace": interpolationFuncReplace(),
"signum": interpolationFuncSignum(),
"split": interpolationFuncSplit(),
"sha1": interpolationFuncSha1(),
"sha256": interpolationFuncSha256(),
Expand Down Expand Up @@ -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 {
Expand Down
36 changes: 36 additions & 0 deletions config/interpolate_funcs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
5 changes: 5 additions & 0 deletions website/source/docs/configuration/interpolation.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you mind also mentioning the example from the issue? I think that would help users to better understand possible use-cases of this function.

i.e. I'd change this

Example: element(split(",", var.r53_failover_policy), signum(count.index))

to

Example: element(split(",", var.r53_failover_policy), signum(count.index)) where the zeroth index points to PRIMARY and 1st to FAILOVER


* `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
Expand Down