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) } }