Files
vif-log/internal/export/export.go
T
2026-08-06 10:18:22 -04:00

56 lines
1.3 KiB
Go

package export
import (
"bufio"
"io"
"os"
"github.com/lixenwraith/vif-log/internal/logfile"
)
// Exporter serialises a record set. JSONL is the only implementation; a plain
// text renderer is the second.
type Exporter interface {
Ext() string
Write(w io.Writer, rd *logfile.Reader, metas []logfile.Meta) (int, error)
}
// JSONL writes the verbatim source lines, so an export reopens in the viewer.
type JSONL struct{}
func (JSONL) Ext() string { return ".jsonl" }
func (JSONL) Write(w io.Writer, rd *logfile.Reader, metas []logfile.Meta) (int, error) {
bw := bufio.NewWriterSize(w, 1<<16)
n := 0
for _, m := range metas {
line, err := rd.Line(m)
if err != nil {
return n, err
}
if _, err := bw.Write(line); err != nil {
return n, err
}
if err := bw.WriteByte('\n'); err != nil {
return n, err
}
n++
}
return n, bw.Flush()
}
// ToFile writes metas to path. The file is created exclusively: an export can
// never overwrite a log.
func ToFile(path string, e Exporter, rd *logfile.Reader, metas []logfile.Meta) (int, error) {
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o644)
if err != nil {
return 0, err
}
defer f.Close()
n, err := e.Write(f, rd, metas)
if err != nil {
return n, err
}
return n, f.Sync()
}