|
from typing import Any, Dict, Optional, Sequence, Type |
|
|
|
from pydantic import BaseModel, create_model |
|
from starlette.exceptions import HTTPException as StarletteHTTPException |
|
from starlette.exceptions import WebSocketException as WebSocketException |
|
|
|
|
|
class HTTPException(StarletteHTTPException): |
|
def __init__( |
|
self, |
|
status_code: int, |
|
detail: Any = None, |
|
headers: Optional[Dict[str, str]] = None, |
|
) -> None: |
|
super().__init__(status_code=status_code, detail=detail, headers=headers) |
|
|
|
|
|
RequestErrorModel: Type[BaseModel] = create_model("Request") |
|
WebSocketErrorModel: Type[BaseModel] = create_model("WebSocket") |
|
|
|
|
|
class FastAPIError(RuntimeError): |
|
""" |
|
A generic, FastAPI-specific error. |
|
""" |
|
|
|
|
|
class ValidationException(Exception): |
|
def __init__(self, errors: Sequence[Any]) -> None: |
|
self._errors = errors |
|
|
|
def errors(self) -> Sequence[Any]: |
|
return self._errors |
|
|
|
|
|
class RequestValidationError(ValidationException): |
|
def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: |
|
super().__init__(errors) |
|
self.body = body |
|
|
|
|
|
class WebSocketRequestValidationError(ValidationException): |
|
pass |
|
|
|
|
|
class ResponseValidationError(ValidationException): |
|
def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: |
|
super().__init__(errors) |
|
self.body = body |
|
|
|
def __str__(self) -> str: |
|
message = f"{len(self._errors)} validation errors:\n" |
|
for err in self._errors: |
|
message += f" {err}\n" |
|
return message |
|
|