3
0
corteza/compose/encoder/encoder.go
Denis Arh 5423cf43c8 Add JSON(L) and CSV record exporting capabilities
API endpoints, CSV and JSON record encoders, dedicated svc/repo methods
2019-08-15 16:42:51 +02:00

84 lines
1.2 KiB
Go

package encoder
type (
multiple uint
field struct {
name string
encodeAllMulti bool
}
FlatWriter interface {
Write([]string) error
Flush()
}
StructuredEncoder interface {
Encode(interface{}) error
}
flatWriter struct {
w FlatWriter
ff []field
}
structuredEncoder struct {
w StructuredEncoder
ff []field
}
)
func Field(name string) field {
return field{name: name}
}
func MakeFields(nn ...string) []field {
ff := make([]field, len(nn))
for i := range nn {
ff[i] = field{name: nn[i]}
}
return ff
}
func MultiValueField(name string) field {
return field{name: name, encodeAllMulti: true}
}
func NewFlatWriter(w FlatWriter, header bool, ff ...field) *flatWriter {
f := &flatWriter{
w: w,
ff: ff,
}
if header {
f.writeHeader()
}
return f
}
func (enc flatWriter) Flush() {
enc.w.Flush()
}
func (enc flatWriter) writeHeader() {
ss := make([]string, len(enc.ff))
for i := range enc.ff {
ss[i] = enc.ff[i].name
}
_ = enc.w.Write(ss)
}
func NewStructuredEncoder(w StructuredEncoder, ff ...field) *structuredEncoder {
return &structuredEncoder{
w: w,
ff: ff,
}
}
func (enc structuredEncoder) Flush() {
// noop
}