Source code for imednet.errors.registry
"""Registry for HTTP status code to error class mappings."""
from __future__ import annotations
import types
from collections.abc import Mapping
from typing import Any
from .api import (
ApiError,
ConflictError,
ForbiddenError,
NotFoundError,
RateLimitError,
ServerError,
UnauthorizedError,
)
from .validation import BadRequestError
# Use MappingProxyType to ensure immutability, avoiding global mutable state
STATUS_TO_ERROR: Mapping[int, type[ApiError]] = types.MappingProxyType(
{
400: BadRequestError,
401: UnauthorizedError,
403: ForbiddenError,
404: NotFoundError,
409: ConflictError,
429: RateLimitError,
}
)
[docs]def get_error_class(status_code: int, response_body: Any = None) -> type[ApiError]:
"""Get error class for status code.
Defaults to generic ApiError for unmapped client/server errors.
"""
if isinstance(response_body, dict):
status = response_body.get("status")
# Identify specific subclasses based on metadata
if status_code == 400 and status == "validation_error":
from .validation import ValidationError
return ValidationError
if status_code == 401 and status == "authentication_failed":
from .api import AuthenticationError
return AuthenticationError
error_cls = STATUS_TO_ERROR.get(status_code)
if error_cls:
return error_cls
if 500 <= status_code < 600:
return ServerError
return ApiError