package recover //nolint:predeclared // TODO: Rename to some non-builtin

import (
	
	
	

	
)

func defaultStackTraceHandler( *fiber.Ctx,  interface{}) {
	_, _ = os.Stderr.WriteString(fmt.Sprintf("panic: %v\n%s\n", , debug.Stack())) //nolint:errcheck // This will never fail
}

// New creates a new middleware handler
func ( ...Config) fiber.Handler {
	// Set default config
	 := configDefault(...)

	// Return new handler
	return func( *fiber.Ctx) ( error) { //nolint:nonamedreturns // Uses recover() to overwrite the error
		// Don't execute middleware if Next returns true
		if .Next != nil && .Next() {
			return .Next()
		}

		// Catch panics
		defer func() {
			if  := recover();  != nil {
				if .EnableStackTrace {
					.StackTraceHandler(, )
				}

				var  bool
				if ,  = .(error); ! {
					// Set error that will call the global error handler
					 = fmt.Errorf("%v", )
				}
			}
		}()

		// Return err if exist, else move to next handler
		return .Next()
	}
}