From 07a07929d48873eca3da971f979894812129e7e6 Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Fri, 10 Apr 2020 19:17:17 -0400 Subject: Allow data.ToCSV to handle more general input types Signed-off-by: Dave Henderson --- data/data.go | 24 ++++++++++++++++++++---- data/data_test.go | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) (limited to 'data') diff --git a/data/data.go b/data/data.go index d0c136bc..beda7f03 100644 --- a/data/data.go +++ b/data/data.go @@ -15,6 +15,7 @@ import ( "github.com/Shopify/ejson" ejsonJson "github.com/Shopify/ejson/json" + "github.com/hairyhenderson/gomplate/v3/conv" "github.com/hairyhenderson/gomplate/v3/env" // XXX: replace once https://github.com/BurntSushi/toml/pull/179 is merged @@ -272,10 +273,25 @@ func ToCSV(args ...interface{}) (string, error) { args = args[1:] } if len(args) == 1 { - var ok bool - in, ok = args[0].([][]string) - if !ok { - return "", errors.Errorf("Can't parse ToCSV input - must be of type [][]string") + switch a := args[0].(type) { + case [][]string: + in = a + case [][]interface{}: + in = make([][]string, len(a)) + for i, v := range a { + in[i] = conv.ToStrings(v...) + } + case []interface{}: + in = make([][]string, len(a)) + for i, v := range a { + ar, ok := v.([]interface{}) + if !ok { + return "", errors.Errorf("Can't parse ToCSV input - must be a two-dimensional array (like [][]string or [][]interface{}) (was %T)", args[0]) + } + in[i] = conv.ToStrings(ar...) + } + default: + return "", errors.Errorf("Can't parse ToCSV input - must be a two-dimensional array (like [][]string or [][]interface{}) (was %T)", args[0]) } } b := &bytes.Buffer{} diff --git a/data/data_test.go b/data/data_test.go index 3ecf02c5..ae2c31c7 100644 --- a/data/data_test.go +++ b/data/data_test.go @@ -336,6 +336,24 @@ func TestToCSV(t *testing.T) { _, err = ToCSV([][]int{{1, 2}}) assert.Error(t, err) + + expected = "first,second,third\r\n1,2,3\r\n4,5,6\r\n" + out, err = ToCSV([][]interface{}{ + {"first", "second", "third"}, + {"1", "2", "3"}, + {"4", "5", "6"}, + }) + assert.NoError(t, err) + assert.Equal(t, expected, out) + + expected = "first|second|third\r\n1|2|3\r\n4|5|6\r\n" + out, err = ToCSV("|", []interface{}{ + []interface{}{"first", "second", "third"}, + []interface{}{1, "2", 3}, + []interface{}{"4", 5, "6"}, + }) + assert.NoError(t, err) + assert.Equal(t, expected, out) } func TestTOML(t *testing.T) { -- cgit v1.2.3