mkcv / backend /api /errors.py
Hyun9junn's picture
sync: from GitHub
3443071 verified
Raw
History Blame Contribute Delete
1.47 kB
"""Error response helpers for FastAPI handlers."""
from __future__ import annotations
from typing import Optional
from fastapi.responses import JSONResponse
from backend.models import CVData
from backend.parsers.yaml_parser import parse_yaml, YAMLParseError, CVValidationError
def error_response(
error_type: str,
message: str,
details: Optional[list[str]] = None,
status: int = 422,
) -> JSONResponse:
"""Build a structured JSON error response.
Renamed from the old `_error` in main.py. Same shape:
{"error": error_type, "message": message, "details": details or []}
"""
return JSONResponse(
status_code=status,
content={"error": error_type, "message": message, "details": details or []},
)
def parse_or_error(yaml_str: str) -> tuple[Optional[CVData], Optional[JSONResponse]]:
"""Parse a CV YAML string into a CVData model.
Returns (cv, None) on success or (None, error_response) on parse/validate
failure. Exactly one of the two return slots is None. Callers handle the
early-return pattern:
cv, err = parse_or_error(req.yaml)
if err:
return err
# use cv ...
"""
try:
cv = parse_yaml(yaml_str)
except YAMLParseError as e:
return None, error_response("invalid_yaml", e.message, e.details)
except CVValidationError as e:
return None, error_response("validation_error", e.message, e.errors)
return cv, None