From 1bbce1aa65e4af84a144b137ea2037004eb2881d Mon Sep 17 00:00:00 2001 From: Victor Häggqvist Date: Wed, 14 Sep 2022 23:54:17 +0200 Subject: go bump --- vendor/github.com/gocarina/gocsv/encode.go | 32 +++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'vendor/github.com/gocarina/gocsv/encode.go') diff --git a/vendor/github.com/gocarina/gocsv/encode.go b/vendor/github.com/gocarina/gocsv/encode.go index 8671533..a7c0e72 100644 --- a/vendor/github.com/gocarina/gocsv/encode.go +++ b/vendor/github.com/gocarina/gocsv/encode.go @@ -1,11 +1,16 @@ package gocsv import ( + "errors" "fmt" "io" "reflect" ) +var ( + ErrChannelIsClosed = errors.New("channel is closed") +) + type encoder struct { out io.Writer } @@ -14,11 +19,11 @@ func newEncoder(out io.Writer) *encoder { return &encoder{out} } -func writeFromChan(writer *SafeCSVWriter, c <-chan interface{}) error { +func writeFromChan(writer CSVWriter, c <-chan interface{}, omitHeaders bool) error { // Get the first value. It wil determine the header structure. firstValue, ok := <-c if !ok { - return fmt.Errorf("channel is closed") + return ErrChannelIsClosed } inValue, inType := getConcreteReflectValueAndType(firstValue) // Get the concrete type if err := ensureStructOrPtr(inType); err != nil { @@ -30,8 +35,10 @@ func writeFromChan(writer *SafeCSVWriter, c <-chan interface{}) error { for i, fieldInfo := range inInnerStructInfo.Fields { // Used to write the header (first line) in CSV csvHeadersLabels[i] = fieldInfo.getFirstKey() } - if err := writer.Write(csvHeadersLabels); err != nil { - return err + if !omitHeaders { + if err := writer.Write(csvHeadersLabels); err != nil { + return err + } } write := func(val reflect.Value) error { for j, fieldInfo := range inInnerStructInfo.Fields { @@ -63,7 +70,7 @@ func writeFromChan(writer *SafeCSVWriter, c <-chan interface{}) error { return writer.Error() } -func writeTo(writer *SafeCSVWriter, in interface{}, omitHeaders bool) error { +func writeTo(writer CSVWriter, in interface{}, omitHeaders bool) error { inValue, inType := getConcreteReflectValueAndType(in) // Get the concrete type (not pointer) (Slice or Array) if err := ensureInType(inType); err != nil { return err @@ -138,6 +145,21 @@ func getInnerField(outInner reflect.Value, outInnerWasPointer bool, index []int) } oi = outInner.Elem() } + + if oi.Kind() == reflect.Slice || oi.Kind() == reflect.Array { + i := index[0] + + if i >= oi.Len() { + return "", nil + } + + item := oi.Index(i) + if len(index) > 1 { + return getInnerField(item, false, index[1:]) + } + return getFieldAsString(item) + } + // because pointers can be nil need to recurse one index at a time and perform nil check if len(index) > 1 { nextField := oi.Field(index[0]) -- cgit v1.2.3