functions: fix lookup()'s handling of numberical defaults

This commit is contained in:
Kristin Laemmert 2018-06-06 08:09:33 -07:00 committed by Martin Atkins
parent 4f5c03339a
commit ff4b3d763b
2 changed files with 19 additions and 4 deletions

View File

@ -463,11 +463,11 @@ var LookupFunc = function.New(&function.Spec{
if len(args) < 1 || len(args) > 3 { if len(args) < 1 || len(args) > 3 {
return cty.NilVal, fmt.Errorf("lookup() takes two or three arguments, got %d", len(args)) return cty.NilVal, fmt.Errorf("lookup() takes two or three arguments, got %d", len(args))
} }
var defaultVal string var defaultVal cty.Value
defaultValueSet := false defaultValueSet := false
if len(args) == 3 { if len(args) == 3 {
defaultVal = args[2].AsString() defaultVal = args[2]
defaultValueSet = true defaultValueSet = true
} }
@ -489,10 +489,16 @@ var LookupFunc = function.New(&function.Spec{
} }
if defaultValueSet { if defaultValueSet {
return cty.StringVal(defaultVal), nil defaultType := defaultVal.Type()
switch {
case defaultType.Equals(cty.String):
return cty.StringVal(defaultVal.AsString()), nil
case defaultType.Equals(cty.Number):
return cty.NumberVal(defaultVal.AsBigFloat()), nil
}
} }
return cty.UnknownVal(cty.String), fmt.Errorf( return cty.UnknownVal(cty.DynamicPseudoType), fmt.Errorf(
"lookup failed to find '%s'", lookupKey) "lookup failed to find '%s'", lookupKey)
}, },
}) })

View File

@ -1001,6 +1001,15 @@ func TestLookup(t *testing.T) {
cty.StringVal("bar"), cty.StringVal("bar"),
false, false,
}, },
{ // Supplied default with valid (int) key
[]cty.Value{
simpleMap,
cty.StringVal("foo"),
cty.NumberIntVal(-1),
},
cty.StringVal("bar"),
false,
},
{ // Supplied default with invalid key { // Supplied default with invalid key
[]cty.Value{ []cty.Value{
simpleMap, simpleMap,