Source code for iamai.middleware
"""Middleware decorators and bound middleware metadata."""
from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Literal, TypeVar
MiddlewareFunc = TypeVar("MiddlewareFunc", bound=Callable[..., Any])
MiddlewarePhase = Literal["before", "around", "after", "error"]
@dataclass(frozen=True, slots=True)
class MiddlewareSpec:
"""Declarative metadata attached to a middleware callback."""
func_name: str
priority: int = 100
phase: MiddlewarePhase = "around"
@dataclass(slots=True)
class BoundMiddleware:
"""A middleware callback bound to a concrete plugin instance."""
plugin: "Plugin"
spec: MiddlewareSpec
callback: Callable[..., Awaitable[Any] | Any]
[docs]
def middleware(
*,
priority: int = 100,
phase: MiddlewarePhase = "around",
) -> Callable[[MiddlewareFunc], MiddlewareFunc]:
"""Decorate a plugin method as middleware for the selected dispatch phase."""
spec = MiddlewareSpec(func_name="", priority=priority, phase=phase)
def decorator(func: MiddlewareFunc) -> MiddlewareFunc:
middlewares = list(getattr(func, "__iamai_middlewares__", []))
middlewares.append(spec)
setattr(func, "__iamai_middlewares__", middlewares)
return func
return decorator
if TYPE_CHECKING:
from .plugin import Plugin