writer.go 1000 B

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