package log

import 

// Helper wraps a Logger with leveled convenience methods for call sites. It is a
// thin value type; adapters implement Logger, not Helper.
//
// Build one with For; the zero Helper logs to Nop.
type Helper struct {
	l Logger // underlying logger, returned by Logger()
	// leveled is l with one extra caller-skip frame, so the leveled methods
	// below report their own caller rather than Helper. It is built once by For
	// to avoid adjusting caller depth on every call.
	leveled Logger
}

// For returns a Helper writing to l, or to Nop if l is nil.
func ( Logger) Helper {
	 = OrNop()
	// The leveled methods add one frame between the call site and the logger;
	// skip it so caller-computing adapters report the caller, not Helper.
	return Helper{l: , leveled: AddCallerSkip(, 1)}
}

func ( Helper) () Logger {
	if .l == nil {
		return Nop
	}
	return .l
}

func ( Helper) () Logger {
	if .leveled == nil {
		return Nop
	}
	return .leveled
}

// Logger returns the underlying Logger, never nil.
func ( Helper) () Logger {
	return .logger()
}

// With returns a Helper whose logger attaches attrs to every record. See With.
func ( Helper) ( ...Attr) Helper {
	return For(With(.logger(), ...))
}

// Named returns a Helper whose logger is tagged with name. See Named.
func ( Helper) ( string) Helper {
	return For(Named(.logger(), ))
}

// Enabled reports whether a record at level would be recorded.
func ( Helper) ( context.Context,  Level) bool {
	return .logger().Enabled(, )
}

// Debug logs at LevelDebug.
func ( Helper) ( context.Context,  string,  ...Attr) {
	.leveledLogger().Log(, LevelDebug, , ...)
}

// Info logs at LevelInfo.
func ( Helper) ( context.Context,  string,  ...Attr) {
	.leveledLogger().Log(, LevelInfo, , ...)
}

// Warn logs at LevelWarn.
func ( Helper) ( context.Context,  string,  ...Attr) {
	.leveledLogger().Log(, LevelWarn, , ...)
}

// Error logs at LevelError.
func ( Helper) ( context.Context,  string,  ...Attr) {
	.leveledLogger().Log(, LevelError, , ...)
}