aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/hashicorp/terraform/lang/funcs/collection.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/lang/funcs/collection.go')
-rw-r--r--vendor/github.com/hashicorp/terraform/lang/funcs/collection.go30
1 files changed, 22 insertions, 8 deletions
diff --git a/vendor/github.com/hashicorp/terraform/lang/funcs/collection.go b/vendor/github.com/hashicorp/terraform/lang/funcs/collection.go
index 71b7a84..bcccc1f 100644
--- a/vendor/github.com/hashicorp/terraform/lang/funcs/collection.go
+++ b/vendor/github.com/hashicorp/terraform/lang/funcs/collection.go
@@ -246,7 +246,7 @@ var CompactFunc = function.New(&function.Spec{
246 246
247 for it := listVal.ElementIterator(); it.Next(); { 247 for it := listVal.ElementIterator(); it.Next(); {
248 _, v := it.Element() 248 _, v := it.Element()
249 if v.AsString() == "" { 249 if v.IsNull() || v.AsString() == "" {
250 continue 250 continue
251 } 251 }
252 outputList = append(outputList, v) 252 outputList = append(outputList, v)
@@ -363,6 +363,9 @@ var DistinctFunc = function.New(&function.Spec{
363 } 363 }
364 } 364 }
365 365
366 if len(list) == 0 {
367 return cty.ListValEmpty(retType.ElementType()), nil
368 }
366 return cty.ListVal(list), nil 369 return cty.ListVal(list), nil
367 }, 370 },
368}) 371})
@@ -389,6 +392,10 @@ var ChunklistFunc = function.New(&function.Spec{
389 return cty.UnknownVal(retType), nil 392 return cty.UnknownVal(retType), nil
390 } 393 }
391 394
395 if listVal.LengthInt() == 0 {
396 return cty.ListValEmpty(listVal.Type()), nil
397 }
398
392 var size int 399 var size int
393 err = gocty.FromCtyValue(args[1], &size) 400 err = gocty.FromCtyValue(args[1], &size)
394 if err != nil { 401 if err != nil {
@@ -686,8 +693,10 @@ var LookupFunc = function.New(&function.Spec{
686 return cty.StringVal(v.AsString()), nil 693 return cty.StringVal(v.AsString()), nil
687 case ty.Equals(cty.Number): 694 case ty.Equals(cty.Number):
688 return cty.NumberVal(v.AsBigFloat()), nil 695 return cty.NumberVal(v.AsBigFloat()), nil
696 case ty.Equals(cty.Bool):
697 return cty.BoolVal(v.True()), nil
689 default: 698 default:
690 return cty.NilVal, errors.New("lookup() can only be used with flat lists") 699 return cty.NilVal, errors.New("lookup() can only be used with maps of primitive types")
691 } 700 }
692 } 701 }
693 } 702 }
@@ -797,10 +806,12 @@ var MatchkeysFunc = function.New(&function.Spec{
797 }, 806 },
798 }, 807 },
799 Type: func(args []cty.Value) (cty.Type, error) { 808 Type: func(args []cty.Value) (cty.Type, error) {
800 if !args[1].Type().Equals(args[2].Type()) { 809 ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()})
801 return cty.NilType, errors.New("lists must be of the same type") 810 if ty == cty.NilType {
811 return cty.NilType, errors.New("keys and searchset must be of the same type")
802 } 812 }
803 813
814 // the return type is based on args[0] (values)
804 return args[0].Type(), nil 815 return args[0].Type(), nil
805 }, 816 },
806 Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { 817 Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) {
@@ -813,10 +824,14 @@ var MatchkeysFunc = function.New(&function.Spec{
813 } 824 }
814 825
815 output := make([]cty.Value, 0) 826 output := make([]cty.Value, 0)
816
817 values := args[0] 827 values := args[0]
818 keys := args[1] 828
819 searchset := args[2] 829 // Keys and searchset must be the same type.
830 // We can skip error checking here because we've already verified that
831 // they can be unified in the Type function
832 ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()})
833 keys, _ := convert.Convert(args[1], ty)
834 searchset, _ := convert.Convert(args[2], ty)
820 835
821 // if searchset is empty, return an empty list. 836 // if searchset is empty, return an empty list.
822 if searchset.LengthInt() == 0 { 837 if searchset.LengthInt() == 0 {
@@ -867,7 +882,6 @@ var MergeFunc = function.New(&function.Spec{
867 Name: "maps", 882 Name: "maps",
868 Type: cty.DynamicPseudoType, 883 Type: cty.DynamicPseudoType,
869 AllowDynamicType: true, 884 AllowDynamicType: true,
870 AllowNull: true,
871 }, 885 },
872 Type: function.StaticReturnType(cty.DynamicPseudoType), 886 Type: function.StaticReturnType(cty.DynamicPseudoType),
873 Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { 887 Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) {