72 lines
1.6 KiB
Python
72 lines
1.6 KiB
Python
"""Error types for task plane operations."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
class TaskPlaneError(Exception):
|
|
"""Base exception for API-compatible failures."""
|
|
|
|
status_code = 500
|
|
error_code = "task_plane_error"
|
|
|
|
def __init__(self, message: str, *, code: str | None = None, details: dict | None = None):
|
|
super().__init__(message)
|
|
self.message = message
|
|
self.details = details or {}
|
|
if code:
|
|
self.error_code = code
|
|
|
|
def to_payload(self) -> dict:
|
|
return {"error": self.error_code, "message": self.message, "details": self.details}
|
|
|
|
|
|
class TaskPlaneHTTPError(TaskPlaneError):
|
|
"""Base class with explicit HTTP status."""
|
|
|
|
status_code = 500
|
|
|
|
|
|
class ValidationError(TaskPlaneHTTPError):
|
|
status_code = 400
|
|
error_code = "validation_error"
|
|
|
|
|
|
class UnauthorizedError(TaskPlaneHTTPError):
|
|
status_code = 401
|
|
error_code = "unauthorized"
|
|
|
|
|
|
class ForbiddenError(TaskPlaneHTTPError):
|
|
status_code = 403
|
|
error_code = "forbidden"
|
|
|
|
|
|
class NotFoundError(TaskPlaneHTTPError):
|
|
status_code = 404
|
|
error_code = "not_found"
|
|
|
|
|
|
class ConflictError(TaskPlaneHTTPError):
|
|
status_code = 409
|
|
error_code = "conflict"
|
|
|
|
|
|
class PayloadTooLargeError(TaskPlaneHTTPError):
|
|
status_code = 413
|
|
error_code = "payload_too_large"
|
|
|
|
|
|
class FailedDependencyError(TaskPlaneHTTPError):
|
|
status_code = 424
|
|
error_code = "failed_dependency"
|
|
|
|
|
|
class LockedError(TaskPlaneHTTPError):
|
|
status_code = 423
|
|
error_code = "locked"
|
|
|
|
|
|
class ServiceUnavailableError(TaskPlaneHTTPError):
|
|
status_code = 503
|
|
error_code = "service_unavailable"
|