diff --git a/exporter/csv.go b/exporter/csv.go index f4d5aa5..cd2cac4 100644 --- a/exporter/csv.go +++ b/exporter/csv.go @@ -12,19 +12,24 @@ import ( // CSVExporter exports response data as CSV streaming file type CSVExporter struct { FileName string + Comma rune + UseCRLF bool } // Export exports response data as CSV streaming file func (e *CSVExporter) Export(exports chan interface{}) { - // Create file - newFile, err := os.OpenFile(internal.PreferFirst(e.FileName, "out.csv"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + // Create or append file + file, err := os.OpenFile(internal.PreferFirst(e.FileName, "out.csv"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Printf("Output file creation error: %v\n", err) return } + defer file.Close() - writer := csv.NewWriter(newFile) + writer := csv.NewWriter(file) + writer.Comma = internal.PreferFirstRune(e.Comma, ',') + writer.UseCRLF = e.UseCRLF // Export data as responses came for res := range exports { diff --git a/exporter/csv_test.go b/exporter/csv_test.go new file mode 100644 index 0000000..77ae40d --- /dev/null +++ b/exporter/csv_test.go @@ -0,0 +1,16 @@ +package exporter + +import "testing" + +func TestCSVExporter_Export(t *testing.T) { + ch := make(chan interface{}) + defer close(ch) + + exporter := &CSVExporter{ + FileName: "test.out", + Comma: ';', + } + go exporter.Export(ch) + + ch <- []string{"1", "2"} +} diff --git a/exporter/json.go b/exporter/json.go index ad597c0..96f9b6a 100644 --- a/exporter/json.go +++ b/exporter/json.go @@ -11,20 +11,24 @@ import ( type JSONExporter struct { FileName string EscapeHTML bool + Prefix string + Indent string } // Export exports response data as JSON streaming file func (e *JSONExporter) Export(exports chan interface{}) { - // Create file - newFile, err := os.OpenFile(internal.PreferFirst(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + // Create or append file + file, err := os.OpenFile(internal.PreferFirst(e.FileName, "out.json"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Printf("Output file creation error: %v\n", err) return } + defer file.Close() - encoder := json.NewEncoder(newFile) + encoder := json.NewEncoder(file) encoder.SetEscapeHTML(e.EscapeHTML) + encoder.SetIndent(e.Prefix, e.Indent) // Export data as responses came for res := range exports { diff --git a/exporter/json_test.go b/exporter/json_test.go new file mode 100644 index 0000000..71784a7 --- /dev/null +++ b/exporter/json_test.go @@ -0,0 +1,16 @@ +package exporter + +import "testing" + +func TestJSONExporter_Export(t *testing.T) { + ch := make(chan interface{}) + defer close(ch) + + exporter := &JSONExporter{ + FileName: "test.json", + Indent: " ", + } + go exporter.Export(ch) + + ch <- map[string]string{"key": "value"} +} diff --git a/internal/strings.go b/internal/strings.go index 2734e8e..f05be13 100644 --- a/internal/strings.go +++ b/internal/strings.go @@ -8,6 +8,14 @@ func PreferFirst(first string, second string) string { return second } +// PreferFirstRune returns first non-empty rune +func PreferFirstRune(first rune, second rune) rune { + if first != 0 { + return first + } + return second +} + // Contains checks whether []string Contains string func Contains(s []string, e string) bool { for _, a := range s {