blob: 4cc802b29ba65350c15a1f7126972f84c40e1353 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package slog
import (
"context"
"errors"
)
// NewMultiHandler creates a [MultiHandler] with the given Handlers.
func NewMultiHandler(handlers ...Handler) *MultiHandler {
h := make([]Handler, len(handlers))
copy(h, handlers)
return &MultiHandler{multi: h}
}
// MultiHandler is a [Handler] that invokes all the given Handlers.
// Its Enable method reports whether any of the handlers' Enabled methods return true.
// Its Handle, WithAttr and WithGroup methods call the corresponding method on each of the enabled handlers.
type MultiHandler struct {
multi []Handler
}
func (h *MultiHandler) Enabled(ctx context.Context, l Level) bool {
for i := range h.multi {
if h.multi[i].Enabled(ctx, l) {
return true
}
}
return false
}
func (h *MultiHandler) Handle(ctx context.Context, r Record) error {
var errs []error
for i := range h.multi {
if h.multi[i].Enabled(ctx, r.Level) {
if err := h.multi[i].Handle(ctx, r.Clone()); err != nil {
errs = append(errs, err)
}
}
}
return errors.Join(errs...)
}
func (h *MultiHandler) WithAttrs(attrs []Attr) Handler {
handlers := make([]Handler, 0, len(h.multi))
for i := range h.multi {
handlers = append(handlers, h.multi[i].WithAttrs(attrs))
}
return &MultiHandler{multi: handlers}
}
func (h *MultiHandler) WithGroup(name string) Handler {
handlers := make([]Handler, 0, len(h.multi))
for i := range h.multi {
handlers = append(handlers, h.multi[i].WithGroup(name))
}
return &MultiHandler{multi: handlers}
}