Skip to content

Commit

Permalink
Add a logarithm function
Browse files Browse the repository at this point in the history
Fixes hashicorp#9498. Adds a `log` function for calculating logarithms.
  • Loading branch information
joshuaspence committed May 5, 2017
1 parent 26a91ab commit 38d4d2f
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
12 changes: 12 additions & 0 deletions config/interpolate_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ func Funcs() map[string]ast.Function {
"jsonencode": interpolationFuncJSONEncode(),
"length": interpolationFuncLength(),
"list": interpolationFuncList(),
"log": interpolationFuncLog(),
"lower": interpolationFuncLower(),
"map": interpolationFuncMap(),
"max": interpolationFuncMax(),
Expand Down Expand Up @@ -489,6 +490,17 @@ func interpolationFuncCeil() ast.Function {
}
}

// interpolationFuncLog returns the logarithnm.
func interpolationFuncLog() ast.Function {
return ast.Function{
ArgTypes: []ast.Type{ast.TypeFloat, ast.TypeFloat},
ReturnType: ast.TypeFloat,
Callback: func(args []interface{}) (interface{}, error) {
return math.Log(args[0].(float64)) / math.Log(args[1].(float64)), nil
},
}
}

// interpolationFuncChomp removes trailing newlines from the given string
func interpolationFuncChomp() ast.Function {
newlines := regexp.MustCompile(`(?:\r\n?|\n)*\z`)
Expand Down
28 changes: 28 additions & 0 deletions config/interpolate_funcs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,34 @@ func TestInterpolateFuncCeil(t *testing.T) {
})
}

func TestInterpolateFuncLog(t *testing.T) {
testFunction(t, testFunctionConfig{
Cases: []testFunctionCase{
{
`${log(1, 10)}`,
"0",
false,
},
{
`${log(10, 10)}`,
"1",
false,
},

{
`${log(0, 10)}`,
"-Inf",
false,
},
{
`${log(10, 0)}`,
"-0",
false,
},
},
})
}

func TestInterpolateFuncChomp(t *testing.T) {
testFunction(t, testFunctionConfig{
Cases: []testFunctionCase{
Expand Down
2 changes: 2 additions & 0 deletions website/source/docs/configuration/interpolation.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ The supported built-in functions are:
* `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`.
* `${list()}` returns an empty list.

* `log(x, base)` - Returns the logarithm of `x`.

* `lookup(map, key, [default])` - Performs a dynamic lookup into a map
variable. The `map` parameter should be another variable, such
as `var.amis`. If `key` does not exist in `map`, the interpolation will
Expand Down

0 comments on commit 38d4d2f

Please sign in to comment.