summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2020-04-10 19:17:17 -0400
committerDave Henderson <dhenderson@gmail.com>2020-04-10 19:17:17 -0400
commit07a07929d48873eca3da971f979894812129e7e6 (patch)
treed362efc36bd27e354b7b22cbd790f50b4165614e /data
parent6bad5772bf31b6e7fece57457f85c4f48cf4995e (diff)
Allow data.ToCSV to handle more general input types
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'data')
-rw-r--r--data/data.go24
-rw-r--r--data/data_test.go18
2 files changed, 38 insertions, 4 deletions
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) {