import asyncio from collections.abc import Callable from functools import wraps from typing import Any, TypeVar, cast from click import get_current_context from pyxdi import PyxDI from campaigns.utils.asyncio import run_async F = TypeVar("F", bound=Callable[..., Any]) def pass_di(f: F) -> F: """ Pass the dependency injection container into command. """ @wraps(f) def wrapper(*args, **kwargs): # type: ignore async def main() -> Any: di: PyxDI = get_current_context().obj await di.astart() try: async with di.arequest_context(): if asyncio.iscoroutinefunction(f): return await f(di, *args, **kwargs) else: return await run_async(f, di, *args, **kwargs) finally: await di.aclose() asyncio.run(main()) return cast(F, wrapper)