use thiserror::Error;
use super::{AtomError, NodeError};
use crate::NodeIndex;
#[derive(Debug, Clone, PartialEq, Error)]
pub enum MoleculeError {
#[error(transparent)]
NodeError(#[from] NodeError),
#[error(transparent)]
AtomError(#[from] AtomError),
#[error("aromatic ring {ring:?} has {pi_electrons} pi electrons (Huckel: 4n+2 required)")]
HuckelViolation {
ring: Vec<NodeIndex>,
pi_electrons: u8,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn node_error_conversion() {
let node_err = NodeError::UndefinedHydrogen;
let mol_err: MoleculeError = node_err.into();
assert!(matches!(mol_err, MoleculeError::NodeError(_)));
assert_eq!(mol_err.to_string(), "undefined hydrogen count");
}
#[test]
fn atom_error_conversion() {
let atom_err = AtomError::UnknownElement("Zz".to_string());
let mol_err: MoleculeError = atom_err.into();
assert!(matches!(mol_err, MoleculeError::AtomError(_)));
assert_eq!(mol_err.to_string(), "unknown element: 'Zz'");
}
}