lookup will return a tuple type when passed an object

This commit is contained in:
Kristin Laemmert 2018-10-16 14:55:57 -07:00 committed by Martin Atkins
parent f54ee830d3
commit fd77e56fd6
2 changed files with 7 additions and 9 deletions

View File

@ -513,11 +513,11 @@ var LookupFunc = function.New(&function.Spec{
// return the default type // return the default type
return args[2].Type(), nil return args[2].Type(), nil
} }
return cty.DynamicPseudoType, fmt.Errorf("the given object has no attribute %q", key) return cty.DynamicPseudoType, function.NewArgErrorf(0, "the given object has no attribute %q", key)
case ty.IsMapType(): case ty.IsMapType():
return ty.ElementType(), nil return ty.ElementType(), nil
default: default:
return cty.NilType, fmt.Errorf("lookup() requires a map as the first argument") return cty.NilType, function.NewArgErrorf(0, "lookup() requires a map as the first argument")
} }
}, },
Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) { Impl: func(args []cty.Value, retType cty.Type) (ret cty.Value, err error) {
@ -878,11 +878,7 @@ var ValuesFunc = function.New(&function.Spec{
for _, v := range ty.AttributeTypes() { for _, v := range ty.AttributeTypes() {
tys = append(tys, v) tys = append(tys, v)
} }
retType, _ := convert.UnifyUnsafe(tys) return cty.Tuple(tys), nil
if retType == cty.NilType {
return cty.NilType, fmt.Errorf("all arguments must have the same type")
}
return cty.List(retType), nil
} }
return cty.NilType, fmt.Errorf("values() requires a map as the first argument") return cty.NilType, fmt.Errorf("values() requires a map as the first argument")
}, },
@ -918,10 +914,12 @@ var ValuesFunc = function.New(&function.Spec{
} }
} }
if retType.IsTupleType() {
return cty.TupleVal(values), nil
}
if len(values) == 0 { if len(values) == 0 {
return cty.ListValEmpty(retType.ElementType()), nil return cty.ListValEmpty(retType.ElementType()), nil
} }
return cty.ListVal(values), nil return cty.ListVal(values), nil
}, },
}) })

View File

@ -1983,7 +1983,7 @@ func TestValues(t *testing.T) {
"hello": cty.StringVal("world"), "hello": cty.StringVal("world"),
"what's": cty.StringVal("up"), "what's": cty.StringVal("up"),
}), }),
cty.ListVal([]cty.Value{ cty.TupleVal([]cty.Value{
cty.StringVal("world"), cty.StringVal("world"),
cty.StringVal("up"), cty.StringVal("up"),
}), }),