From d8fbaa79248a92e5c3919a1c7e90f6e5b7c09c7e Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 9 Jun 2016 13:02:30 -0400 Subject: [PATCH] Serialization for hash panics on TypeMap The serializeCollectionMemberForHash helper can't be called for the MapType values, because MapType doesn't have a schema.Elem. Instead, we can write the key/value pairs directly to the buffer. This still doesn't allow for nested maps or lists, but we need to define that use case before committing to it here. --- helper/schema/serialize.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/helper/schema/serialize.go b/helper/schema/serialize.go index 78f5bfbd6..3eb2d0075 100644 --- a/helper/schema/serialize.go +++ b/helper/schema/serialize.go @@ -2,6 +2,7 @@ package schema import ( "bytes" + "fmt" "sort" "strconv" ) @@ -33,6 +34,7 @@ func SerializeValueForHash(buf *bytes.Buffer, val interface{}, schema *Schema) { } buf.WriteRune(')') case TypeMap: + m := val.(map[string]interface{}) var keys []string for k := range m { @@ -42,9 +44,24 @@ func SerializeValueForHash(buf *bytes.Buffer, val interface{}, schema *Schema) { buf.WriteRune('[') for _, k := range keys { innerVal := m[k] + if innerVal == nil { + continue + } buf.WriteString(k) buf.WriteRune(':') - serializeCollectionMemberForHash(buf, innerVal, schema.Elem) + + switch innerVal := innerVal.(type) { + case int: + buf.WriteString(strconv.Itoa(innerVal)) + case float64: + buf.WriteString(strconv.FormatFloat(innerVal, 'g', -1, 64)) + case string: + buf.WriteString(innerVal) + default: + panic(fmt.Sprintf("unknown value type in TypeMap %T", innerVal)) + } + + buf.WriteRune(';') } buf.WriteRune(']') case TypeSet: @@ -100,6 +117,6 @@ func serializeCollectionMemberForHash(buf *bytes.Buffer, val interface{}, elem i SerializeResourceForHash(buf, val, tElem) buf.WriteString(">;") default: - panic("invalid element type") + panic(fmt.Sprintf("invalid element type: %T", tElem)) } }