diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/lang/funcs/collection.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/lang/funcs/collection.go | 30 |
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) { |