diff --git a/decode_test.go b/decode_test.go index 60ba511..2d56942 100644 --- a/decode_test.go +++ b/decode_test.go @@ -494,6 +494,24 @@ func TestDecoder(t *testing.T) { value: map[string]interface{}{"a": "50cent_of_dollar"}, }, + // Unconventional keys + { + source: "1: v\n", + value: map[int]string{1: "v"}, + }, + { + source: "1.1: v\n", + value: map[float64]string{1.1: "v"}, + }, + { + source: "true: v\n", + value: map[bool]string{true: "v"}, + }, + { + source: "2015-01-01T00:00:00Z: v\n", + value: map[time.Time]string{time.Date(2015, 1, 1, 0, 0, 0, 0, time.UTC): "v"}, + }, + // Nulls { source: "null", diff --git a/encode.go b/encode.go index a686f28..e810608 100644 --- a/encode.go +++ b/encode.go @@ -712,9 +712,15 @@ func (e *Encoder) encodeMap(ctx context.Context, value reflect.Value, column int anchorNode.Value = encoded encoded = anchorNode } + + kn, err := e.encodeValue(ctx, reflect.ValueOf(key), column) + keyNode, ok := kn.(ast.MapKeyNode) + if !ok || err != nil { + keyNode = e.encodeString(fmt.Sprint(key), column) + } node.Values = append(node.Values, ast.MappingValue( nil, - e.encodeString(keyText, column), + keyNode, encoded, )) e.setSmartAnchor(vRef, keyText) diff --git a/encode_test.go b/encode_test.go index 85a33dd..8d91996 100644 --- a/encode_test.go +++ b/encode_test.go @@ -187,6 +187,26 @@ func TestEncoder(t *testing.T) { map[string]string{"a": "-"}, nil, }, + { + "1: v\n", + map[int]string{1: "v"}, + nil, + }, + { + "1.1: v\n", + map[float64]string{1.1: "v"}, + nil, + }, + { + "true: v\n", + map[bool]string{true: "v"}, + nil, + }, + { + "2015-01-01T00:00:00Z: v\n", + map[time.Time]string{time.Date(2015, 1, 1, 0, 0, 0, 0, time.UTC): "v"}, + nil, + }, { "123\n", 123,