"""HTTP error helpers."""
from typing import Any
from fastapi import Request
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from starlette import status
class AppError(Exception):
def __init__(
self,
code: str,
message: str,
*,
status_code: int = status.HTTP_400_BAD_REQUEST,
details: dict[str, Any] | None = None,
) -> None:
self.code = code
self.message = message
self.status_code = status_code
self.details = details or {}
def error_response(
code: str, message: str, status_code: int, details: dict[str, Any] | None = None
):
return JSONResponse(
status_code=status_code,
content={"error": {"code": code, "message": message, "details": details or {}}},
)
async def app_error_handler(_request: Request, exc: AppError) -> JSONResponse:
return error_response(exc.code, exc.message, exc.status_code, exc.details)
async def validation_error_handler(_request: Request, exc: RequestValidationError) -> JSONResponse:
return error_response(
"validation_error",
"Request validation failed",
status.HTTP_422_UNPROCESSABLE_ENTITY,
{"fields": exc.errors()},
)