"""CodexLens exception hierarchy.""" from __future__ import annotations class CodexLensError(Exception): """Base class for all CodexLens errors.""" class ConfigError(CodexLensError): """Raised when configuration is invalid or cannot be loaded.""" class ParseError(CodexLensError): """Raised when parsing or indexing a file fails.""" class StorageError(CodexLensError): """Raised when reading/writing index storage fails. Attributes: message: Human-readable error description db_path: Path to the database file (if applicable) operation: The operation that failed (e.g., 'query', 'initialize', 'migrate') details: Additional context for debugging """ def __init__( self, message: str, db_path: str | None = None, operation: str | None = None, details: dict | None = None ) -> None: super().__init__(message) self.message = message self.db_path = db_path self.operation = operation self.details = details or {} def __str__(self) -> str: parts = [self.message] if self.db_path: parts.append(f"[db: {self.db_path}]") if self.operation: parts.append(f"[op: {self.operation}]") if self.details: detail_str = ", ".join(f"{k}={v}" for k, v in self.details.items()) parts.append(f"[{detail_str}]") return " ".join(parts) class SearchError(CodexLensError): """Raised when a search operation fails.""" class IndexNotFoundError(CodexLensError): """Raised when a project's index cannot be found."""