use crate::{index::error::IndexError, network::NetworkError};
use deadpool::managed::PoolError;
use never::Never;
use thiserror::Error;
use tokio::sync::AcquireError;
#[derive(Error, Debug, Clone)]
pub enum Error {
#[error("Configuration Error: {0}")]
Config(String),
#[error("Network Layer Error: {0}")]
Network(#[from] NetworkError),
#[error("Index Layer Error: {0}")]
Index(#[from] IndexError),
#[error("Callback Error: {0}")]
Callback(String),
#[error("Operation cancelled by user callback")]
OperationCancelled,
#[error("Feature not yet implemented: {0}")]
NotImplemented(String),
#[error("Internal Library Error: {0}")]
Internal(String),
#[error("Callback cancelled operation")]
CancelledByCallback,
#[error("Callback failed: {0}")]
CallbackFailed(String),
#[error("Callback error: {0}")]
CallbackError(String),
#[error("Worker Pool Error: {0}")]
PoolError(String),
#[error("Operation timed out: {0}")]
Timeout(String),
}
impl From<PoolError<Never>> for Error {
fn from(e: PoolError<Never>) -> Self {
Error::PoolError(e.to_string())
}
}
impl From<AcquireError> for Error {
fn from(e: AcquireError) -> Self {
Error::PoolError(format!("Worker pool semaphore acquisition failed: {}", e))
}
}