v0.1.0 initial commit
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user