"""structlog BoundLogger dependency functions are defined here.""" from fastapi import FastAPI, Request from structlog.stdlib import BoundLogger def init_dispencer(app: FastAPI, logger: BoundLogger) -> None: """Initialize BoundLogger dispencer at app's state.""" if hasattr(app.state, "logger"): if not isinstance(app.state.logger_dep, BoundLogger): raise ValueError( "logger attribute of app's state is already set" f"with other value ({app.state.logger_dep})" ) return app.state.logger_dep = logger def attach_to_request(request: Request, logger: BoundLogger) -> None: """Set logger for a concrete request. If request had already had a logger, replace it.""" if hasattr(request.state, "logger_dep"): if not isinstance(request.state.logger_dep, BoundLogger): logger.warning("request.state.logger is already set with other value", value=request.state.logger_dep) request.state.logger_dep = logger def obtain(app_or_request: FastAPI | Request) -> BoundLogger: """Get a logger from request or app state.""" if isinstance(app_or_request, Request): if hasattr(app_or_request.state, "logger_dep"): logger = app_or_request.state.logger_dep if isinstance(logger, BoundLogger): return logger app_or_request = app_or_request.app if not hasattr(app_or_request.state, "logger_dep"): raise ValueError("BoundLogger dispencer was not initialized at app preparation") return app_or_request.state.logger_dep