use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum BrahmandaError {
#[error("invalid galaxy parameter: {0}")]
InvalidGalaxy(String),
#[error("invalid structure parameter: {0}")]
InvalidStructure(String),
#[error("convergence failure after {iterations} iterations: {detail}")]
ConvergenceFailed { iterations: usize, detail: String },
#[error("computation error: {0}")]
Computation(String),
#[error("non-finite input in {context}: {value}")]
NonFinite { context: &'static str, value: f64 },
}
#[inline]
pub fn require_finite(value: f64, context: &'static str) -> Result<(), BrahmandaError> {
if value.is_finite() {
Ok(())
} else {
Err(BrahmandaError::NonFinite { context, value })
}
}
#[inline]
pub fn require_all_finite(values: &[f64], context: &'static str) -> Result<(), BrahmandaError> {
for &v in values {
require_finite(v, context)?;
}
Ok(())
}
#[inline]
pub fn ensure_finite(value: f64, context: &'static str) -> Result<f64, BrahmandaError> {
if value.is_finite() {
Ok(value)
} else {
Err(BrahmandaError::Computation(format!(
"{context}: result is {value}"
)))
}
}