logger/tea/tea.go
2025-07-25 09:17:26 +01:00

64 lines
1.2 KiB
Go

package tea
import (
tea "github.com/charmbracelet/bubbletea"
"go.uber.org/zap/zapcore"
)
type Core struct {
zapcore.LevelEnabler
enc zapcore.Encoder
prog *tea.Program
}
type LogMsg string
func NewLogger(prog *tea.Program, encoder zapcore.Encoder, enabler zapcore.LevelEnabler) zapcore.Core {
core := Core{}
core.LevelEnabler = enabler
core.enc = encoder
core.prog = prog
return &core
}
func (c *Core) With(fields []zapcore.Field) zapcore.Core {
clone := c.clone()
addFields(clone.enc, fields)
return clone
}
func (c *Core) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) *zapcore.CheckedEntry {
if c.Enabled(entry.Level) {
return checked.AddCore(entry, c)
}
return checked
}
func (c *Core) Write(ent zapcore.Entry, fields []zapcore.Field) error {
buf, err := c.enc.EncodeEntry(ent, fields)
if err != nil {
return err
}
c.prog.Send(LogMsg(buf.Bytes()))
defer buf.Free()
return nil
}
func (c *Core) Sync() error {
return nil
}
func (c *Core) clone() *Core {
return &Core{
LevelEnabler: c.LevelEnabler,
enc: c.enc.Clone(),
prog: c.prog,
}
}
func addFields(enc zapcore.ObjectEncoder, fields []zapcore.Field) {
for i := range fields {
fields[i].AddTo(enc)
}
}