| from __future__ import annotations | |
| class AppError(Exception): | |
| def __init__( | |
| self, | |
| detail: str | dict[str, object], | |
| *, | |
| status_code: int, | |
| headers: dict[str, str] | None = None, | |
| ) -> None: | |
| super().__init__(str(detail)) | |
| self.detail = detail | |
| self.status_code = status_code | |
| self.headers = headers or {} | |
| class BadRequestError(AppError): | |
| def __init__(self, detail: str | dict[str, object]) -> None: | |
| super().__init__(detail, status_code=400) | |
| class AuthenticationError(AppError): | |
| def __init__(self, detail: str = "Could not validate credentials") -> None: | |
| super().__init__( | |
| detail, | |
| status_code=401, | |
| headers={"WWW-Authenticate": "Bearer"}, | |
| ) | |
| class ForbiddenError(AppError): | |
| def __init__(self, detail: str = "Forbidden") -> None: | |
| super().__init__(detail, status_code=403) | |
| class NotFoundError(AppError): | |
| def __init__(self, detail: str) -> None: | |
| super().__init__(detail, status_code=404) | |
| class ConflictError(AppError): | |
| def __init__(self, detail: str) -> None: | |
| super().__init__(detail, status_code=400) | |