use thiserror::Error;
use std::io;
#[derive(Error, Debug)]
pub enum SciRS2Error {
#[error("Computation error: {0}")]
ComputationError(String),
#[error("Domain error: {0}")]
DomainError(String),
#[error("Convergence error: {0}")]
ConvergenceError(String),
#[error("Dimension mismatch error: {0}")]
DimensionError(String),
#[error("Index out of bounds: {0}")]
IndexError(String),
#[error("Linear algebra error: {0}")]
LinalgError(String),
#[error("Singular matrix error: {0}")]
SingularMatrixError(String),
#[error("Optimization error: {0}")]
OptimizeError(String),
#[error("Integration error: {0}")]
IntegrateError(String),
#[error("Interpolation error: {0}")]
InterpolateError(String),
#[error("Statistics error: {0}")]
StatsError(String),
#[error("Sparse matrix error: {0}")]
SparseError(String),
#[error("FFT error: {0}")]
FFTError(String),
#[error("Not implemented: {0}")]
NotImplementedError(String),
#[error("Value error: {0}")]
ValueError(String),
#[error("Type error: {0}")]
TypeError(String),
#[error("I/O error: {0}")]
IoError(#[from] io::Error),
#[error("Tolerance error: {0}")]
ToleranceError(String),
}
pub type SciRS2Result<T> = Result<T, SciRS2Error>;
#[allow(dead_code)]
pub fn check_domain<S: AsRef<str>>(condition: bool, message: S) -> SciRS2Result<()> {
if condition {
Ok(())
} else {
Err(SciRS2Error::DomainError(message.as_ref().to_string()))
}
}
#[allow(dead_code)]
pub fn check_dimensions<S: AsRef<str>>(condition: bool, message: S) -> SciRS2Result<()> {
if condition {
Ok(())
} else {
Err(SciRS2Error::DimensionError(message.as_ref().to_string()))
}
}
#[allow(dead_code)]
pub fn check_value<S: AsRef<str>>(condition: bool, message: S) -> SciRS2Result<()> {
if condition {
Ok(())
} else {
Err(SciRS2Error::ValueError(message.as_ref().to_string()))
}
}
#[allow(dead_code)]
pub fn check_index<S: AsRef<str>>(condition: bool, message: S) -> SciRS2Result<()> {
if condition {
Ok(())
} else {
Err(SciRS2Error::IndexError(message.as_ref().to_string()))
}
}
#[cfg(feature = "linalg")]
impl From<scirs2_linalg::LinalgError> for SciRS2Error {
fn from(err: scirs2_linalg::LinalgError) -> Self {
match err {
scirs2_linalg::LinalgError::ComputationError(msg) => SciRS2Error::ComputationError(msg),
scirs2_linalg::LinalgError::DomainError(msg) => SciRS2Error::DomainError(msg),
scirs2_linalg::LinalgError::ConvergenceError(msg) => SciRS2Error::ConvergenceError(msg),
scirs2_linalg::LinalgError::DimensionError(msg) => SciRS2Error::DimensionError(msg),
scirs2_linalg::LinalgError::IndexError(msg) => SciRS2Error::IndexError(msg),
scirs2_linalg::LinalgError::SingularMatrixError(msg) => SciRS2Error::SingularMatrixError(msg),
scirs2_linalg::LinalgError::NonPositiveDefiniteError(msg) => SciRS2Error::LinalgError(msg),
scirs2_linalg::LinalgError::NotImplementedError(msg) => SciRS2Error::NotImplementedError(msg),
scirs2_linalg::LinalgError::ValueError(msg) => SciRS2Error::ValueError(msg),
}
}
}