from typing import Any, Dict, Optional, List
[docs]
class FrameworkException(Exception):
pass
[docs]
class HTTPException(FrameworkException):
status_code = 500
message = "An unexpected error occurred."
data: Optional[Any] = None
def __init__(self, message: Optional[str] = None, status_code: Optional[int] = None, data: Optional[Any] = None):
self.message = message if message is not None else self.__class__.message
self.status_code = status_code if status_code is not None else self.__class__.status_code
self.data = data if data is not None else self.__class__.data
super().__init__(self.message)
[docs]
class BadRequest(HTTPException):
status_code = 400
message = "Bad Request"
def __init__(self, message: Optional[str] = None, data: Optional[Any] = None):
super().__init__(message=message, status_code=400, data=data)
if data is not None and message is None:
self.message = "Validation failed."
[docs]
class NotFound(HTTPException):
status_code = 404
message = "Not Found"
def __init__(self, message: Optional[str] = None, data: Optional[Any] = None):
super().__init__(message=message, data=data)
[docs]
class RouteNotFound(NotFound):
message = "Route Not Found"
def __init__(self, path: str, method: str, message: Optional[str] = None):
super().__init__(message=message, data=None)
self.path = path
self.method = method
if message is None:
self.message = f"No route found for {method} {path}"
[docs]
class Unauthorized(HTTPException):
status_code = 401
message = "Unauthorized"
def __init__(self, message: Optional[str] = None, data: Optional[Any] = None):
super().__init__(message=message, status_code=401, data=data)
[docs]
class Forbidden(HTTPException):
status_code = 403
message = "Forbidden"
def __init__(self, message: Optional[str] = None, data: Optional[Any] = None):
super().__init__(message=message, status_code=403, data=data)
[docs]
class MethodNotAllowed(HTTPException):
status_code = 405
message = "Method Not Allowed"
def __init__(self, path: str, method: str, allowed_methods: list, message: Optional[str] = None):
super().__init__(message=message, status_code=405, data=None)
self.path = path
self.method = method
self.allowed_methods = allowed_methods
if message is None:
self.message = f"Method {method} not allowed for path {path}. Allowed methods: {', '.join(allowed_methods)}"
[docs]
class ServerError(HTTPException):
status_code = 500
message = "Internal Server Error"
def __init__(self, message: Optional[str] = None, data: Optional[Any] = None):
super().__init__(message=message, status_code=500, data=data)
[docs]
class ConfigurationError(FrameworkException):
pass
[docs]
class ValidationError(BadRequest):
status_code = 400
message = "Validation Error"
def __init__(self, errors: Dict[str, List[str]], message: Optional[str] = None):
super().__init__(message=message, status_code=400, data=errors)
if self.message is None:
self.message = "Validation failed."
self.errors = errors