summaryrefslogtreecommitdiffhomepage
path: root/internal/logging/writer.go
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-03-21 18:20:28 +0100
committerKujtim Hoxha <[email protected]>2025-03-21 18:20:28 +0100
commit4b0ea68d7af9a6031a7ffda7ad66e0cb83315750 (patch)
tree8220c1bf6f107ea76dd78c7f57b77000c0c98a22 /internal/logging/writer.go
downloadopencode-4b0ea68d7af9a6031a7ffda7ad66e0cb83315750.tar.gz
opencode-4b0ea68d7af9a6031a7ffda7ad66e0cb83315750.zip
initial
Diffstat (limited to 'internal/logging/writer.go')
-rw-r--r--internal/logging/writer.go49
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
+}