package data import ( "context" "errors" "log/slog" "time" ) type AppLogHandler struct { level slog.Level logFunc func(string, ...any) attrs []slog.Attr groups []string } func NewAppLogHandler(f func(string, ...any)) *AppLogHandler { return &AppLogHandler{logFunc: f} } func (a *AppLogHandler) SetLevel(l slog.Level) { a.level = l } func (a *AppLogHandler) setAttrs(attrs ...slog.Attr) { a.attrs = attrs } func (a *AppLogHandler) addAttrs(attrs ...slog.Attr) { a.attrs = append(a.attrs, attrs...) } func (a *AppLogHandler) setGroups(groups ...string) { a.groups = groups } func (a *AppLogHandler) addGroups(groups ...string) { a.groups = append(a.groups, groups...) } // AppLogHandler can handle all levels func (a *AppLogHandler) Enabled(_ context.Context, lvl slog.Level) bool { return lvl >= a.level } func (a *AppLogHandler) Handle(ctx context.Context, rcd slog.Record) error { if a.logFunc == nil { return errors.New("no log func defined") } a.logFunc("%s %s %s", rcd.Time.Format(time.TimeOnly), rcd.Level, rcd.Message) return nil } func (a *AppLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { attrs = append(attrs, a.attrs...) ret := NewAppLogHandler(a.logFunc) ret.addAttrs(attrs...) return ret } func (a *AppLogHandler) WithGroup(name string) slog.Handler { groups := append(a.groups, name) ret := NewAppLogHandler(a.logFunc) ret.setGroups(groups...) return ret }