Skip to content

Instantly share code, notes, and snippets.

@aliihsansepar
Created February 19, 2025 21:47
Show Gist options
  • Save aliihsansepar/739e22cc4df0394ce64c42caafb551d7 to your computer and use it in GitHub Desktop.
Save aliihsansepar/739e22cc4df0394ce64c42caafb551d7 to your computer and use it in GitHub Desktop.
Go type safe handler
type Request any
type Response any
type HandlerInterface[Req Request, Res Response] interface {
Handle(ctx context.Context, req *Req) (*Res, error)
}
func handle[Req Request, Res Response](handler HandlerInterface[Req, Res]) fiber.Handler {
return func(c *fiber.Ctx) error {
var req Req
if err := c.BodyParser(&req); err != nil && !errors.Is(err, fiber.ErrUnprocessableEntity) {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
}
if err := c.ParamsParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
}
if err := c.QueryParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
}
if err := c.ReqHeaderParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
}
res, err := handler.Handle(c.UserContext(), &req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(res)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment