use sim_kernel::Symbol;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum FemmError {
#[error("UnknownFemmParameter: {0}")]
UnknownFemmParameter(String),
#[error("MissingMaterial: {0}")]
MissingMaterial(String),
#[error("UnsupportedPhysics: {0}")]
UnsupportedPhysics(String),
#[error("MeshLimitExceeded: {0}")]
MeshLimitExceeded(String),
#[error("SolveDidNotConverge: {0}")]
SolveDidNotConverge(String),
#[error("SensitivityUnavailable: {0}")]
SensitivityUnavailable(String),
#[error("BudgetExceeded: {0}")]
BudgetExceeded(String),
#[error("InvalidGeometry: {0}")]
InvalidGeometry(String),
#[error("FieldOutOfDomain: {0}")]
FieldOutOfDomain(String),
#[error("MalformedMatrix: {0}")]
MalformedMatrix(String),
}
impl From<FemmError> for sim_kernel::Error {
fn from(error: FemmError) -> Self {
let category = match &error {
FemmError::UnknownFemmParameter(_) => "unknown-parameter",
FemmError::MissingMaterial(_) => "missing-material",
FemmError::UnsupportedPhysics(_) => "unsupported-physics",
FemmError::MeshLimitExceeded(_) => "mesh-limit",
FemmError::SolveDidNotConverge(_) => "solve-did-not-converge",
FemmError::SensitivityUnavailable(_) => "sensitivity-unavailable",
FemmError::BudgetExceeded(_) => "budget-exceeded",
FemmError::InvalidGeometry(_) => "invalid-geometry",
FemmError::FieldOutOfDomain(_) => "field-out-of-domain",
FemmError::MalformedMatrix(_) => "malformed-matrix",
};
sim_kernel::Error::domain_error(
Symbol::new("femm"),
Symbol::qualified("femm", category),
error.to_string(),
)
}
}
pub type FemmResult<T> = std::result::Result<T, FemmError>;