-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmapwriter.go
82 lines (70 loc) · 1.72 KB
/
mapwriter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package csv
import (
"bytes"
"encoding/csv"
"sort"
"golang.org/x/exp/maps"
)
type mapWriter struct {
writer *csv.Writer
iobuffer *bytes.Buffer
allHeaders []string
}
func NewMapWriter() Writer {
var csvBuffer bytes.Buffer
return &mapWriter{
iobuffer: &csvBuffer,
writer: csv.NewWriter(&csvBuffer),
}
}
func (m *mapWriter) WriteHeaders(headers []string) error {
sort.Strings(headers)
m.allHeaders = headers
return m.writer.Write(headers)
}
func (m *mapWriter) WriteLine(value map[string]string) error {
if value == nil {
return NewError(ErrContract, "values cannot be empty")
}
if m.allHeaders != nil && len(value) != len(m.allHeaders) {
return NewError(ErrContract, "headers length is different of values length")
}
if m.allHeaders == nil {
m.WriteHeaders(maps.Keys(value))
}
return m.write(value)
}
func (m *mapWriter) WriteLines(values []map[string]string) error {
if values == nil {
return NewError(ErrContract, "values cannot be empty")
}
if m.allHeaders != nil && len(values[0]) != len(m.allHeaders) {
return NewError(ErrContract, "headers length is different of values length")
}
if m.allHeaders == nil {
m.WriteHeaders(maps.Keys(values[0]))
}
for _, value := range values {
if err := m.write(value); err != nil {
return err
}
}
return nil
}
func (m *mapWriter) GetData() (*bytes.Buffer, error) {
if err := m.Close(); err != nil {
return nil, err
}
return m.iobuffer, nil
}
func (m *mapWriter) Close() error {
m.writer.Flush()
return m.writer.Error()
}
func (m *mapWriter) write(value map[string]string) error {
toWrite := make([]string, 0, len(m.allHeaders))
for _, header := range m.allHeaders {
toWrite = append(toWrite, value[header])
}
return m.writer.Write(toWrite)
}