File size: 1,653 Bytes
e36aeda | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | // 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}
}
|