84 lines
1.2 KiB
Go
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
|
|
}
|