from __future__ import annotations
from typing import Any
[docs]
class BailoException(Exception):
"""General exception for Bailo response errors."""
def __init__(
self,
message: str,
status_code: int | None = None,
context: dict[str, Any] | None = None,
) -> None:
self.message = message
self.status_code = status_code
self.context = context
super().__init__(message)
def __str__(self) -> str:
lines = []
prefix = f"[{self.status_code}] " if self.status_code is not None else ""
lines.append(f"{prefix}{self.message}")
if self.context and isinstance(self.context, dict):
validation_errors = self.context.get("validationErrors")
if validation_errors and isinstance(validation_errors, list):
lines.append("Validation errors:")
for err in validation_errors:
if isinstance(err, dict):
prop = err.get("property", "unknown")
msg = err.get("message", "unknown error")
lines.append(f" - {prop}: {msg}")
else:
lines.append(f" - {err}")
else:
display_items = {k: v for k, v in self.context.items() if k != "documentationUrl"}
if display_items:
lines.append(f"Context: {display_items}")
documentation_url = self.context.get("documentationUrl")
if documentation_url:
lines.append(f"Documentation: {documentation_url}")
return "\n".join(lines)
[docs]
class ResponseException(Exception):
"""Exception raised when the Bailo API returns a non-JSON response."""