package zapslog

import (
	
	
	

	
)

// encodeFields delegates field encoding to zap itself via Field.AddTo and
// captures the result as slog attributes.
func ( []zapcore.Field) []slog.Attr {
	var  objectEncoder
	for ,  := range  {
		.AddTo(&)
	}
	return .attrs()
}

type namespace struct {
	name    string
	entries []slog.Attr
	child   *namespace
}

// attrs materializes child namespace lazily so namespaces can keep collecting
// fields until the entire object is finished.
func ( *namespace) () []slog.Attr {
	if .child == nil {
		return .entries
	}
	 := append(make([]slog.Attr, 0, len(.entries)+1), .entries...)
	return append(, slog.GroupAttrs(.child.name, .child.()...))
}

// objectEncoder implements [zapcore.ObjectEncoder].
// Zap writes fields into an instance of this type, and it builds a tree of slog attributes.
// root keeps the full result, current points at the namespace currently
// receiving fields.
type objectEncoder struct {
	root    namespace // name is unused
	current *namespace
}

// attrs materializes the accumulated object tree into the final slog attrs.
func ( *objectEncoder) () []slog.Attr {
	return .root.attrs()
}

func ( *objectEncoder) () {
	if .current == nil {
		.current = &.root
	}
}

func ( *objectEncoder) ( slog.Attr) {
	.init()
	.current.entries = append(.current.entries, )
}

// OpenNamespace switches subsequent writes into a child namespace, matching zap’s
// namespace semantics where all following fields belong to that group.
func ( *objectEncoder) ( string) {
	.init()
	 := &namespace{name: }
	.current.child = 
	.current = 
}

func ( *objectEncoder) ( string,  zapcore.ArrayMarshaler) error {
	var  arrayEncoder
	 := .MarshalLogArray(&)
	.addAttr(slog.GroupAttrs(, .attrs...))
	return 
}

func ( *objectEncoder) ( string,  zapcore.ObjectMarshaler) error {
	var  objectEncoder
	 := .MarshalLogObject(&)
	.addAttr(slog.GroupAttrs(, .attrs()...))
	return 
}

func ( *objectEncoder) ( string,  []byte) {
	.addAttr(slog.Any(, ))
}

func ( *objectEncoder) ( string,  []byte) {
	.addAttr(slog.String(, string()))
}

func ( *objectEncoder) ( string,  bool) {
	.addAttr(slog.Bool(, ))
}

func ( *objectEncoder) ( string,  complex128) {
	.addAttr(slog.Any(, ))
}

func ( *objectEncoder) ( string,  complex64) {
	.addAttr(slog.Any(, ))
}

func ( *objectEncoder) ( string,  time.Duration) {
	.addAttr(slog.Duration(, ))
}

func ( *objectEncoder) ( string,  float64) {
	.addAttr(slog.Float64(, ))
}

func ( *objectEncoder) ( string,  float32) {
	.addAttr(slog.Float64(, float64()))
}

func ( *objectEncoder) ( string,  int) {
	.addAttr(slog.Int(, ))
}

func ( *objectEncoder) ( string,  int64) {
	.addAttr(slog.Int64(, ))
}

func ( *objectEncoder) ( string,  int32) {
	.addAttr(slog.Int64(, int64()))
}

func ( *objectEncoder) ( string,  int16) {
	.addAttr(slog.Int64(, int64()))
}

func ( *objectEncoder) ( string,  int8) {
	.addAttr(slog.Int64(, int64()))
}

func ( *objectEncoder) (,  string) {
	.addAttr(slog.String(, ))
}

func ( *objectEncoder) ( string,  time.Time) {
	.addAttr(slog.Time(, ))
}

func ( *objectEncoder) ( string,  uint) {
	.addAttr(slog.Uint64(, uint64()))
}

func ( *objectEncoder) ( string,  uint64) {
	.addAttr(slog.Uint64(, ))
}

func ( *objectEncoder) ( string,  uint32) {
	.addAttr(slog.Uint64(, uint64()))
}

func ( *objectEncoder) ( string,  uint16) {
	.addAttr(slog.Uint64(, uint64()))
}

func ( *objectEncoder) ( string,  uint8) {
	.addAttr(slog.Uint64(, uint64()))
}

func ( *objectEncoder) ( string,  uintptr) {
	.addAttr(slog.Uint64(, uint64()))
}

func ( *objectEncoder) ( string,  any) error {
	.addAttr(slog.Any(, ))
	return nil
}

// arrayEncoder represents array elements as indexed slog attrs and implements
// [zapcore.ArrayEncoder].
type arrayEncoder struct {
	attrs []slog.Attr
}

// appendValue appends array element as an [slog.Attr] keyed by its position.
func ( *arrayEncoder) ( slog.Value) {
	.attrs = append(.attrs, slog.Attr{
		Key:   strconv.Itoa(len(.attrs)),
		Value: ,
	})
}

func ( *arrayEncoder) ( zapcore.ArrayMarshaler) error {
	var  arrayEncoder
	 := .MarshalLogArray(&)
	.appendValue(slog.GroupValue(.attrs...))
	return 
}

func ( *arrayEncoder) ( zapcore.ObjectMarshaler) error {
	var  objectEncoder
	 := .MarshalLogObject(&)
	.appendValue(slog.GroupValue(.attrs()...))
	return 
}

func ( *arrayEncoder) ( any) error {
	.appendValue(slog.AnyValue())
	return nil
}

func ( *arrayEncoder) ( bool) {
	.appendValue(slog.BoolValue())
}

func ( *arrayEncoder) ( []byte) {
	.appendValue(slog.StringValue(string()))
}

func ( *arrayEncoder) ( complex128) {
	.appendValue(slog.AnyValue())
}

func ( *arrayEncoder) ( complex64) {
	.appendValue(slog.AnyValue())
}

func ( *arrayEncoder) ( time.Duration) {
	.appendValue(slog.DurationValue())
}

func ( *arrayEncoder) ( float64) {
	.appendValue(slog.Float64Value())
}

func ( *arrayEncoder) ( float32) {
	.appendValue(slog.Float64Value(float64()))
}

func ( *arrayEncoder) ( int) {
	.appendValue(slog.Int64Value(int64()))
}

func ( *arrayEncoder) ( int64) {
	.appendValue(slog.Int64Value())
}

func ( *arrayEncoder) ( int32) {
	.appendValue(slog.Int64Value(int64()))
}

func ( *arrayEncoder) ( int16) {
	.appendValue(slog.Int64Value(int64()))
}

func ( *arrayEncoder) ( int8) {
	.appendValue(slog.Int64Value(int64()))
}

func ( *arrayEncoder) ( string) {
	.appendValue(slog.StringValue())
}

func ( *arrayEncoder) ( time.Time) {
	.appendValue(slog.TimeValue())
}

func ( *arrayEncoder) ( uint) {
	.appendValue(slog.Uint64Value(uint64()))
}

func ( *arrayEncoder) ( uint64) {
	.appendValue(slog.Uint64Value())
}

func ( *arrayEncoder) ( uint32) {
	.appendValue(slog.Uint64Value(uint64()))
}

func ( *arrayEncoder) ( uint16) {
	.appendValue(slog.Uint64Value(uint64()))
}

func ( *arrayEncoder) ( uint8) {
	.appendValue(slog.Uint64Value(uint64()))
}

func ( *arrayEncoder) ( uintptr) {
	.appendValue(slog.Uint64Value(uint64()))
}