You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
55 lines
1.5 KiB
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 # noqa: F401 |
|
|
|
|
|
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
|
|
|