Skip to content

Error Status Code Mapper

error_status_code_mapper

Maps framework error types to HTTP-like status codes.

ErrorStatusCodeMapper

Assigns status codes to ErrorMessageModel entries based on
the error type.

Default mapping
  • ValidationError / ValidationFailedError → 400
  • RuleViolationError / RuleViolatedError → 409
  • CombinedErrors/group → 422
  • anything else → 500
Example
from forging_blocks.presentation.errors import (
    ErrorMessageModel,
    ErrorStatusCodeMapper,
    ErrorViewModel,
)

mapper = ErrorStatusCodeMapper()
msg = ErrorMessageModel(title="Not found")
view = ErrorViewModel(messages=(msg,))
result = mapper.map(view)
assert result.messages[0].status_code is not None
Source code in src/forging_blocks/presentation/errors/error_status_code_mapper.py
class ErrorStatusCodeMapper:
    """Assigns status codes to ``ErrorMessageModel`` entries based on
    the error type.

    Default mapping:
        - ``ValidationError`` / ``ValidationFailedError`` → 400
        - ``RuleViolationError`` / ``RuleViolatedError``   → 409
        - ``CombinedErrors``/group                    → 422
        - anything else                               → 500

    Example:
        ```python
        from forging_blocks.presentation.errors import (
            ErrorMessageModel,
            ErrorStatusCodeMapper,
            ErrorViewModel,
        )

        mapper = ErrorStatusCodeMapper()
        msg = ErrorMessageModel(title="Not found")
        view = ErrorViewModel(messages=(msg,))
        result = mapper.map(view)
        assert result.messages[0].status_code is not None
        ```
    """

    def map(self, view_model: ErrorViewModel) -> ErrorViewModel:
        """Return a new ``ErrorViewModel`` with ``status_code`` set on
        every message.

        Args:
            view_model: The view model produced by
                ``ErrorPresenter.to_view_model``.

        Returns:
            A new ``ErrorViewModel`` whose ``ErrorMessageModel``
            entries each carry the appropriate ``status_code``.

        """
        enriched = tuple(
            replace(msg, status_code=self._status_code_for(msg.code)) for msg in view_model.messages
        )
        return ErrorViewModel(messages=enriched)

    def _status_code_for(self, code: str | None) -> int:
        if code is None:
            return 500
        status_map: dict[str, int] = {
            "ValidationError": 400,
            "ValidationFailedError": 400,
            "ValidationFieldErrors": 400,
            "CombinedValidationErrors": 400,
            "RuleViolationError": 409,
            "RuleViolatedError": 409,
            "CombinedRuleViolationErrors": 409,
            "CombinedErrors": 422,
            "FieldErrors": 422,
        }
        return status_map.get(code, 500)

map(view_model: ErrorViewModel) -> ErrorViewModel

Return a new ErrorViewModel with status_code set on
every message.

Parameters:

Name Type Description Default
view_model ErrorViewModel

The view model produced by
ErrorPresenter.to_view_model.

required

Returns:

Type Description
ErrorViewModel

A new ErrorViewModel whose ErrorMessageModel

ErrorViewModel

entries each carry the appropriate status_code.

Source code in src/forging_blocks/presentation/errors/error_status_code_mapper.py
def map(self, view_model: ErrorViewModel) -> ErrorViewModel:
    """Return a new ``ErrorViewModel`` with ``status_code`` set on
    every message.

    Args:
        view_model: The view model produced by
            ``ErrorPresenter.to_view_model``.

    Returns:
        A new ``ErrorViewModel`` whose ``ErrorMessageModel``
        entries each carry the appropriate ``status_code``.

    """
    enriched = tuple(
        replace(msg, status_code=self._status_code_for(msg.code)) for msg in view_model.messages
    )
    return ErrorViewModel(messages=enriched)