from __future__ import annotations from typing import TYPE_CHECKING from marshmallow import Schema, ValidationError from ..errors import BadRequest from ..request import Request from ..response import Response from .base import Middleware if TYPE_CHECKING: from src.logger import BoundLogger __all__ = ["SchemaValidationMiddleware", "MatchInfoMiddleware"] class SchemaValidationMiddleware(Middleware): def handle(self, request: Request, *, logger: "BoundLogger", **match_info) -> Response: try: return self.handler(request, logger=logger, **match_info) except ValidationError as e: raise BadRequest(e.normalized_messages()) from e class MatchInfoMiddleware(Middleware): def handle(self, request: Request, *, logger: "BoundLogger", **match_info) -> Response: path_schema: Schema = self.__apispec__["request"].get("path") if path_schema: match_info = path_schema.load(match_info) return self.handler(request, logger=logger, **match_info)