package utils import ( "fmt" "strings" "github.com/go-playground/validator/v10" ) var validate *validator.Validate func init() { validate = validator.New() } // ValidationErrorResponse represents the structure of validation errors returned to the client type ValidationErrorResponse struct { Errors map[string]string `json:"errors"` } // ValidateStruct validates a struct based on its tags using go-playground/validator func ValidateStruct(s interface{}) *ValidationErrorResponse { err := validate.Struct(s) if err != nil { var errorsMap = make(map[string]string) for _, err := range err.(validator.ValidationErrors) { // Simpler error messages for now. Can be enhanced with universal-translator. fieldName := strings.ToLower(err.Field()) switch err.Tag() { case "required": errorsMap[fieldName] = fmt.Sprintf("Field '%s' is required", fieldName) case "email": errorsMap[fieldName] = fmt.Sprintf("Field '%s' must be a valid email", fieldName) case "min": errorsMap[fieldName] = fmt.Sprintf("Field '%s' must be at least %s characters long", fieldName, err.Param()) case "max": errorsMap[fieldName] = fmt.Sprintf("Field '%s' must be at most %s characters long", fieldName, err.Param()) case "alphanum": errorsMap[fieldName] = fmt.Sprintf("Field '%s' must contain only alphanumeric characters", fieldName) default: errorsMap[fieldName] = fmt.Sprintf("Field '%s' failed validation on '%s' tag", fieldName, err.Tag()) } } return &ValidationErrorResponse{Errors: errorsMap} } return nil }