diff options
| author | Kujtim Hoxha <[email protected]> | 2025-03-21 18:20:28 +0100 |
|---|---|---|
| committer | Kujtim Hoxha <[email protected]> | 2025-03-21 18:20:28 +0100 |
| commit | 4b0ea68d7af9a6031a7ffda7ad66e0cb83315750 (patch) | |
| tree | 8220c1bf6f107ea76dd78c7f57b77000c0c98a22 /internal/logging/writer.go | |
| download | opencode-4b0ea68d7af9a6031a7ffda7ad66e0cb83315750.tar.gz opencode-4b0ea68d7af9a6031a7ffda7ad66e0cb83315750.zip | |
initial
Diffstat (limited to 'internal/logging/writer.go')
| -rw-r--r-- | internal/logging/writer.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/logging/writer.go b/internal/logging/writer.go new file mode 100644 index 000000000..b4e899b30 --- /dev/null +++ b/internal/logging/writer.go @@ -0,0 +1,49 @@ +package logging + +import ( + "bytes" + "fmt" + "time" + + "github.com/go-logfmt/logfmt" + "github.com/kujtimiihoxha/termai/internal/pubsub" +) + +type writer struct { + messages []Message + *pubsub.Broker[Message] +} + +func (w *writer) Write(p []byte) (int, error) { + d := logfmt.NewDecoder(bytes.NewReader(p)) + for d.ScanRecord() { + msg := Message{ + ID: time.Now().Format(time.RFC3339Nano), + } + for d.ScanKeyval() { + switch string(d.Key()) { + case "time": + parsed, err := time.Parse(time.RFC3339, string(d.Value())) + if err != nil { + return 0, fmt.Errorf("parsing time: %w", err) + } + msg.Time = parsed + case "level": + msg.Level = string(d.Value()) + case "msg": + msg.Message = string(d.Value()) + default: + msg.Attributes = append(msg.Attributes, Attr{ + Key: string(d.Key()), + Value: string(d.Value()), + }) + } + } + w.messages = append(w.messages, msg) + w.Publish(pubsub.CreatedEvent, msg) + } + if d.Err() != nil { + return 0, d.Err() + } + return len(p), nil +} |
