package handlers import ( "errors" "net/http" "strings" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) // bindingError отвечает на ошибку разбора тела запроса. // Сырые тексты gin/validator (имена структур и тегов) наружу не уходят: // клиенту уходит «поле: причина», написанная понятным языком. func bindingError(c *gin.Context, err error) { var ve validator.ValidationErrors if errors.As(err, &ve) { msgs := make([]string, 0, len(ve)) for _, fe := range ve { msgs = append(msgs, fe.Field()+" "+fieldMessage(fe)) } c.JSON(http.StatusBadRequest, gin.H{"error": strings.Join(msgs, "; ")}) return } // Невалидный JSON, не тот тип поля и прочее. c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request body"}) } func fieldMessage(fe validator.FieldError) string { switch fe.Tag() { case "required": return "is required" case "email": return "must be a valid email" case "min": return "must be at least " + fe.Param() + " characters" case "max": return "must be at most " + fe.Param() + " characters" case "oneof": return "must be one of: " + fe.Param() case "uuid": return "must be a valid UUID" default: return "is invalid" } }