for it := listVal.ElementIterator(); it.Next(); {
_, v := it.Element()
- if v.AsString() == "" {
+ if v.IsNull() || v.AsString() == "" {
continue
}
outputList = append(outputList, v)
}
}
+ if len(list) == 0 {
+ return cty.ListValEmpty(retType.ElementType()), nil
+ }
return cty.ListVal(list), nil
},
})
return cty.UnknownVal(retType), nil
}
+ if listVal.LengthInt() == 0 {
+ return cty.ListValEmpty(listVal.Type()), nil
+ }
+
var size int
err = gocty.FromCtyValue(args[1], &size)
if err != nil {
return cty.StringVal(v.AsString()), nil
case ty.Equals(cty.Number):
return cty.NumberVal(v.AsBigFloat()), nil
+ case ty.Equals(cty.Bool):
+ return cty.BoolVal(v.True()), nil
default:
- return cty.NilVal, errors.New("lookup() can only be used with flat lists")
+ return cty.NilVal, errors.New("lookup() can only be used with maps of primitive types")
}
}
}
},
},
Type: func(args []cty.Value) (cty.Type, error) {
- if !args[1].Type().Equals(args[2].Type()) {
- return cty.NilType, errors.New("lists must be of the same type")
+ ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()})
+ if ty == cty.NilType {
+ return cty.NilType, errors.New("keys and searchset must be of the same type")
}
+ // the return type is based on args[0] (values)
return args[0].Type(), nil
},
Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) {
}
output := make([]cty.Value, 0)
-
values := args[0]
- keys := args[1]
- searchset := args[2]
+
+ // Keys and searchset must be the same type.
+ // We can skip error checking here because we've already verified that
+ // they can be unified in the Type function
+ ty, _ := convert.UnifyUnsafe([]cty.Type{args[1].Type(), args[2].Type()})
+ keys, _ := convert.Convert(args[1], ty)
+ searchset, _ := convert.Convert(args[2], ty)
// if searchset is empty, return an empty list.
if searchset.LengthInt() == 0 {
Name: "maps",
Type: cty.DynamicPseudoType,
AllowDynamicType: true,
- AllowNull: true,
},
Type: function.StaticReturnType(cty.DynamicPseudoType),
Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) {