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}