summaryrefslogtreecommitdiffhomepage
path: root/internal/logging/writer.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/logging/writer.go')
-rw-r--r--internal/logging/writer.go49
1 files changed, 45 insertions, 4 deletions
diff --git a/internal/logging/writer.go b/internal/logging/writer.go
index 06a5330e3..9fe469c5e 100644
--- a/internal/logging/writer.go
+++ b/internal/logging/writer.go
@@ -2,18 +2,47 @@ package logging
import (
"bytes"
+ "context"
"fmt"
+ "strings"
+ "sync"
"time"
"github.com/go-logfmt/logfmt"
"github.com/kujtimiihoxha/termai/internal/pubsub"
)
-type writer struct {
+const (
+ persistKeyArg = "$_persist"
+ PersistTimeArg = "$_persist_time"
+)
+
+type LogData struct {
messages []LogMessage
*pubsub.Broker[LogMessage]
+ lock sync.Mutex
+}
+
+func (l *LogData) Add(msg LogMessage) {
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ l.messages = append(l.messages, msg)
+ l.Publish(pubsub.CreatedEvent, msg)
+}
+
+func (l *LogData) List() []LogMessage {
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ return l.messages
+}
+
+var defaultLogData = &LogData{
+ messages: make([]LogMessage, 0),
+ Broker: pubsub.NewBroker[LogMessage](),
}
+type writer struct{}
+
func (w *writer) Write(p []byte) (int, error) {
d := logfmt.NewDecoder(bytes.NewReader(p))
for d.ScanRecord() {
@@ -30,7 +59,7 @@ func (w *writer) Write(p []byte) (int, error) {
}
msg.Time = parsed
case "level":
- msg.Level = string(d.Value())
+ msg.Level = strings.ToLower(string(d.Value()))
case "msg":
msg.Message = string(d.Value())
default:
@@ -50,11 +79,23 @@ func (w *writer) Write(p []byte) (int, error) {
}
}
}
- w.messages = append(w.messages, msg)
- w.Publish(pubsub.CreatedEvent, msg)
+ defaultLogData.Add(msg)
}
if d.Err() != nil {
return 0, d.Err()
}
return len(p), nil
}
+
+func NewWriter() *writer {
+ w := &writer{}
+ return w
+}
+
+func Subscribe(ctx context.Context) <-chan pubsub.Event[LogMessage] {
+ return defaultLogData.Subscribe(ctx)
+}
+
+func List() []LogMessage {
+ return defaultLogData.List()
+}