writer.go

 1package logging
 2
 3import (
 4	"bytes"
 5	"fmt"
 6	"time"
 7
 8	"github.com/go-logfmt/logfmt"
 9	"github.com/kujtimiihoxha/termai/internal/pubsub"
10)
11
12type writer struct {
13	messages []Message
14	*pubsub.Broker[Message]
15}
16
17func (w *writer) Write(p []byte) (int, error) {
18	d := logfmt.NewDecoder(bytes.NewReader(p))
19	for d.ScanRecord() {
20		msg := Message{
21			ID: time.Now().Format(time.RFC3339Nano),
22		}
23		for d.ScanKeyval() {
24			switch string(d.Key()) {
25			case "time":
26				parsed, err := time.Parse(time.RFC3339, string(d.Value()))
27				if err != nil {
28					return 0, fmt.Errorf("parsing time: %w", err)
29				}
30				msg.Time = parsed
31			case "level":
32				msg.Level = string(d.Value())
33			case "msg":
34				msg.Message = string(d.Value())
35			default:
36				msg.Attributes = append(msg.Attributes, Attr{
37					Key:   string(d.Key()),
38					Value: string(d.Value()),
39				})
40			}
41		}
42		w.messages = append(w.messages, msg)
43		w.Publish(pubsub.CreatedEvent, msg)
44	}
45	if d.Err() != nil {
46		return 0, d.Err()
47	}
48	return len(p), nil
49}