diff --git a/vendor/github.com/zclconf/go-cty/cty/convert/conversion.go b/vendor/github.com/zclconf/go-cty/cty/convert/conversion.go index 1e6541d3a..b064bfb7d 100644 --- a/vendor/github.com/zclconf/go-cty/cty/convert/conversion.go +++ b/vendor/github.com/zclconf/go-cty/cty/convert/conversion.go @@ -76,6 +76,10 @@ func getConversionKnown(in cty.Type, out cty.Type, unsafe bool) conversion { outEty := out.ElementType() return conversionTupleToList(in, outEty, unsafe) + case out.IsMapType() && in.IsObjectType(): + outEty := out.ElementType() + return conversionObjectToMap(in, outEty, unsafe) + default: return nil diff --git a/vendor/github.com/zclconf/go-cty/cty/convert/conversion_collection.go b/vendor/github.com/zclconf/go-cty/cty/convert/conversion_collection.go index 42802f0a5..a6a4c35d7 100644 --- a/vendor/github.com/zclconf/go-cty/cty/convert/conversion_collection.go +++ b/vendor/github.com/zclconf/go-cty/cty/convert/conversion_collection.go @@ -113,3 +113,74 @@ func conversionTupleToList(tupleType cty.Type, listEty cty.Type, unsafe bool) co return cty.ListVal(elems), nil } } + +// conversionObjectToMap returns a conversion that will take a value of the +// given object type and return a map of the given element type. +// +// Will panic if the given objectType isn't actually an object type. +func conversionObjectToMap(objectType cty.Type, mapEty cty.Type, unsafe bool) conversion { + objectAtys := objectType.AttributeTypes() + + if len(objectAtys) == 0 { + // Empty object short-circuit + return func(val cty.Value, path cty.Path) (cty.Value, error) { + return cty.MapValEmpty(mapEty), nil + } + } + + if mapEty == cty.DynamicPseudoType { + // This is a special case where the caller wants us to find + // a suitable single type that all elements can convert to, if + // possible. + objectAtysList := make([]cty.Type, 0, len(objectAtys)) + for _, aty := range objectAtys { + objectAtysList = append(objectAtysList, aty) + } + mapEty, _ = unify(objectAtysList, unsafe) + if mapEty == cty.NilType { + return nil + } + } + + elemConvs := make(map[string]conversion, len(objectAtys)) + for name, objectAty := range objectAtys { + if objectAty.Equals(mapEty) { + // no conversion required + continue + } + + elemConvs[name] = getConversion(objectAty, mapEty, unsafe) + if elemConvs[name] == nil { + // If any of our element conversions are impossible, then the our + // whole conversion is impossible. + return nil + } + } + + // If we fall out here then a conversion is possible, using the + // element conversions in elemConvs + return func(val cty.Value, path cty.Path) (cty.Value, error) { + elems := make(map[string]cty.Value, len(elemConvs)) + path = append(path, nil) + it := val.ElementIterator() + for it.Next() { + name, val := it.Element() + var err error + + path[len(path)-1] = cty.IndexStep{ + Key: name, + } + + conv := elemConvs[name.AsString()] + if conv != nil { + val, err = conv(val, path) + if err != nil { + return cty.NilVal, err + } + } + elems[name.AsString()] = val + } + + return cty.MapVal(elems), nil + } +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 2bc86cda0..da4ba5d10 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -2035,44 +2035,44 @@ { "checksumSHA1": "R9ayYqxeUsPcIbs6KXCVwDIdf6M=", "path": "github.com/zclconf/go-cty/cty", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { - "checksumSHA1": "eNB2+F8P+0eldrN50x4YioU9jIs=", + "checksumSHA1": "IjvfMUZ9S1L1NM0haXwMfKzkyvM=", "path": "github.com/zclconf/go-cty/cty/convert", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "TU21yqpRZdbEbH8pp4I5YsQa00E=", "path": "github.com/zclconf/go-cty/cty/function", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "Ke4kpRBTSophcLSCrusR8XxSC0Y=", "path": "github.com/zclconf/go-cty/cty/function/stdlib", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "tmCzwfNXOEB1sSO7TKVzilb2vjA=", "path": "github.com/zclconf/go-cty/cty/gocty", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "1ApmO+Q33+Oem/3f6BU6sztJWNc=", "path": "github.com/zclconf/go-cty/cty/json", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "gH4rRyzIQknMIXAJfpvC04KTsME=", "path": "github.com/zclconf/go-cty/cty/set", - "revision": "782e9a3a01c10a244d7440ee6590443d761deb74", - "revisionTime": "2017-07-26T01:06:00Z" + "revision": "8bf222d6d03b7b336d013978f3acbfd877da428f", + "revisionTime": "2017-10-13T21:58:09Z" }, { "checksumSHA1": "vE43s37+4CJ2CDU6TlOUOYE0K9c=",