from collections.abc import Callable from fastapi import APIRouter, HTTPException from hub_core.schemas.policy import PolicyRead, PolicyUpdate PolicyLoader = Callable[[str], PolicyRead | None] PolicyUpdater = Callable[[str, str], PolicyRead] def create_policy_router( load_policy: PolicyLoader, update_policy: PolicyUpdater | None = None, ) -> APIRouter: router = APIRouter(prefix="/policy", tags=["policy"]) @router.get("/{name}", response_model=PolicyRead) def get_policy(name: str) -> PolicyRead: policy = load_policy(name) if policy is None: raise HTTPException(status_code=404, detail=f"Policy '{name}' not found") return policy if update_policy is not None: @router.put("/{name}", response_model=PolicyRead) def put_policy(name: str, body: PolicyUpdate) -> PolicyRead: return update_policy(name, body.content) return router