From 1bd9461acbccdf10268f9740405857b2550557ee Mon Sep 17 00:00:00 2001 From: Micah Stetson Date: Sat, 14 Nov 2020 18:15:35 -0800 Subject: [PATCH] Fix ToMap for tables in mixed-type arrays (#453) --- tomltree_write.go | 21 ++++++++++++++++++++- tomltree_write_test.go | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/tomltree_write.go b/tomltree_write.go index ae6dac4..d3c592d 100644 --- a/tomltree_write.go +++ b/tomltree_write.go @@ -510,8 +510,27 @@ func (t *Tree) ToMap() map[string]interface{} { case *Tree: result[k] = node.ToMap() case *tomlValue: - result[k] = node.value + result[k] = node.toValue() } } return result } + +// toValue converts a tomlValue to a built-in Go type. +func (t *tomlValue) toValue() interface{} { + switch v := t.value.(type) { + case []interface{}: + s := make([]interface{}, len(v)) + for i := range s { + switch e := v[i].(type) { + case *Tree: + s[i] = e.ToMap() + default: + s[i] = e + } + } + return s + default: + return v + } +} diff --git a/tomltree_write_test.go b/tomltree_write_test.go index efbe885..c28e1e0 100644 --- a/tomltree_write_test.go +++ b/tomltree_write_test.go @@ -295,6 +295,21 @@ func TestTreeWriteToMapWithArrayOfInlineTables(t *testing.T) { testMaps(t, treeMap, expected) } +func TestTreeWriteToMapWithTableInMixedArray(t *testing.T) { + tree, _ := Load(`a = ["foo", {bar = "baz"}]`) + expected := map[string]interface{}{ + "a": []interface{}{ + "foo", + map[string]interface{}{ + "bar": "baz", + }, + }, + } + treeMap := tree.ToMap() + + testMaps(t, treeMap, expected) +} + func TestTreeWriteToFloat(t *testing.T) { tree, err := Load(`a = 3.0`) if err != nil {