package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

// 自定义 Recovery 中间件
func CustomRecovery() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				// 记录错误
				fmt.Printf("Panic: %v\n", err)

				// 返回友好的错误响应
				c.JSON(500, gin.H{
					"error":   "Internal Server Error",
					"message": fmt.Sprintf("%v", err),
				})

				// 中止处理链
				c.Abort()
			}
		}()

		c.Next()
	}
}

func main() {
	r := gin.New()

	// 使用自定义 Recovery
	r.Use(CustomRecovery())
	r.Use(gin.Logger())

	// 正常路由
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "OK"})
	})

	// 故意触发 panic
	r.GET("/panic", func(c *gin.Context) {
		panic("Something went wrong!")
	})

	r.Run(":9999")
}
