File size: 1,043 Bytes
a896a8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from __future__ import annotations

from typing import Any


def normalize_error(
    detail: Any,
    *,
    status_code: int | None = None,
    default_code: str = "http_error",
) -> dict[str, Any]:
    """
    Normalize FastAPI/Starlette error "detail" into a consistent shape.

    Shape:
      {"code": str, "message": str, "status": int|None, "details": Any|None}
    """
    if isinstance(detail, dict):
        code = str(detail.get("code") or default_code)
        message = str(detail.get("message") or detail.get("detail") or "Error")
        details = detail.get("details")
        return {"code": code, "message": message, "status": status_code, "details": details}
    if isinstance(detail, list):
        return {"code": default_code, "message": "Validation error", "status": status_code, "details": detail}
    if detail is None:
        return {"code": default_code, "message": "Error", "status": status_code, "details": None}
    return {"code": default_code, "message": str(detail), "status": status_code, "details": None}