// 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 (
	
	
)

// NewMultiHandler creates a [MultiHandler] with the given Handlers.
func ( ...Handler) *MultiHandler {
	 := make([]Handler, len())
	copy(, )
	return &MultiHandler{multi: }
}

// 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 ( *MultiHandler) ( context.Context,  Level) bool {
	for  := range .multi {
		if .multi[].Enabled(, ) {
			return true
		}
	}
	return false
}

func ( *MultiHandler) ( context.Context,  Record) error {
	var  []error
	for  := range .multi {
		if .multi[].Enabled(, .Level) {
			if  := .multi[].Handle(, .Clone());  != nil {
				 = append(, )
			}
		}
	}
	return errors.Join(...)
}

func ( *MultiHandler) ( []Attr) Handler {
	 := make([]Handler, 0, len(.multi))
	for  := range .multi {
		 = append(, .multi[].WithAttrs())
	}
	return &MultiHandler{multi: }
}

func ( *MultiHandler) ( string) Handler {
	 := make([]Handler, 0, len(.multi))
	for  := range .multi {
		 = append(, .multi[].WithGroup())
	}
	return &MultiHandler{multi: }
}