validators.py•2.68 kB
"""Input validation utilities."""
import re
from uuid import UUID
from .errors import MCPValidationError
def validate_uuid(value: str, field_name: str = "id") -> str:
"""
Validate that a string is a valid UUID.
Args:
value: The string to validate
field_name: Name of the field for error messages
Returns:
The validated UUID string in standard format
Raises:
MCPValidationError: If the value is not a valid UUID
"""
if not value:
raise MCPValidationError(
message=f"{field_name} cannot be empty",
field=field_name,
)
try:
# Parse and normalize the UUID
uuid_obj = UUID(value)
return str(uuid_obj)
except ValueError as e:
raise MCPValidationError(
message=f"Invalid UUID format: {str(e)}",
field=field_name,
) from e
def validate_page_params(page: int, per_page: int) -> tuple[int, int]:
"""
Validate pagination parameters.
Args:
page: Page number (1-indexed)
per_page: Number of items per page
Returns:
Tuple of (validated_page, validated_per_page)
Raises:
MCPValidationError: If parameters are invalid
"""
if page < 1:
raise MCPValidationError(
message="Page number must be greater than 0",
field="page",
)
if per_page < 1:
raise MCPValidationError(
message="Items per page must be greater than 0",
field="per_page",
)
if per_page > 100:
raise MCPValidationError(
message="Items per page cannot exceed 100",
field="per_page",
)
return page, per_page
def validate_phone(phone: str) -> str:
"""
Validate Vietnamese phone number format.
Expected format: +84XXXXXXXXX (10-11 digits after +84)
Args:
phone: Phone number to validate
Returns:
The validated phone number
Raises:
MCPValidationError: If phone format is invalid
"""
if not phone:
raise MCPValidationError(
message="Phone number cannot be empty",
field="phone",
)
# Remove all spaces and dashes for validation
cleaned = re.sub(r"[\s-]", "", phone)
# Vietnamese phone pattern: +84 followed by 9-10 digits
pattern = r"^\+84[0-9]{9,10}$"
if not re.match(pattern, cleaned):
raise MCPValidationError(
message=(
"Invalid Vietnamese phone format. "
"Expected format: +84XXXXXXXXX (9-10 digits after +84)"
),
field="phone",
)
return cleaned