import os import sys import traceback from collections.abc import Callable from typing import Final from pydantic import BaseModel, ConfigDict from src.worker.request import WorkerRequest WORKER_REQUEST: Final = "WORKER_REQUEST" class ErrorOutput(BaseModel): model_config = ConfigDict(frozen=True, extra="forbid") error: str message: str def run_handler[T_Request: WorkerRequest, T_Result: BaseModel]( request_schema: type[T_Request], handler: Callable[[T_Request], T_Result], ) -> None: try: request = request_schema.model_validate_json(os.environ[WORKER_REQUEST]) result = handler(request) except Exception as exc: traceback.print_exc() sys.stdout.write(ErrorOutput(error=type(exc).__name__, message=str(exc)).model_dump_json()) sys.exit(1) sys.stdout.write(result.model_dump_json())