elements_rs 0.2.6

A comprehensive library for chemical elements and their isotopes with rich metadata
Documentation
//! Submodule implementing the `RelativeAtomicMass` trait for the `Isotope`
//! enum.

impl super::RelativeAtomicMass for super::Isotope {
    #[inline]
    #[allow(clippy::too_many_lines)]
    fn relative_atomic_mass(&self) -> f64 {
        match self {
            Self::H(isotope) => isotope.relative_atomic_mass(),
            Self::He(isotope) => isotope.relative_atomic_mass(),
            Self::Li(isotope) => isotope.relative_atomic_mass(),
            Self::Be(isotope) => isotope.relative_atomic_mass(),
            Self::B(isotope) => isotope.relative_atomic_mass(),
            Self::C(isotope) => isotope.relative_atomic_mass(),
            Self::N(isotope) => isotope.relative_atomic_mass(),
            Self::O(isotope) => isotope.relative_atomic_mass(),
            Self::F(isotope) => isotope.relative_atomic_mass(),
            Self::Ne(isotope) => isotope.relative_atomic_mass(),
            Self::Na(isotope) => isotope.relative_atomic_mass(),
            Self::Mg(isotope) => isotope.relative_atomic_mass(),
            Self::Al(isotope) => isotope.relative_atomic_mass(),
            Self::Si(isotope) => isotope.relative_atomic_mass(),
            Self::P(isotope) => isotope.relative_atomic_mass(),
            Self::S(isotope) => isotope.relative_atomic_mass(),
            Self::Cl(isotope) => isotope.relative_atomic_mass(),
            Self::Ar(isotope) => isotope.relative_atomic_mass(),
            Self::K(isotope) => isotope.relative_atomic_mass(),
            Self::Ca(isotope) => isotope.relative_atomic_mass(),
            Self::Sc(isotope) => isotope.relative_atomic_mass(),
            Self::Ti(isotope) => isotope.relative_atomic_mass(),
            Self::V(isotope) => isotope.relative_atomic_mass(),
            Self::Cr(isotope) => isotope.relative_atomic_mass(),
            Self::Mn(isotope) => isotope.relative_atomic_mass(),
            Self::Fe(isotope) => isotope.relative_atomic_mass(),
            Self::Co(isotope) => isotope.relative_atomic_mass(),
            Self::Ni(isotope) => isotope.relative_atomic_mass(),
            Self::Cu(isotope) => isotope.relative_atomic_mass(),
            Self::Zn(isotope) => isotope.relative_atomic_mass(),
            Self::Ga(isotope) => isotope.relative_atomic_mass(),
            Self::Ge(isotope) => isotope.relative_atomic_mass(),
            Self::As(isotope) => isotope.relative_atomic_mass(),
            Self::Se(isotope) => isotope.relative_atomic_mass(),
            Self::Br(isotope) => isotope.relative_atomic_mass(),
            Self::Kr(isotope) => isotope.relative_atomic_mass(),
            Self::Rb(isotope) => isotope.relative_atomic_mass(),
            Self::Sr(isotope) => isotope.relative_atomic_mass(),
            Self::Y(isotope) => isotope.relative_atomic_mass(),
            Self::Zr(isotope) => isotope.relative_atomic_mass(),
            Self::Nb(isotope) => isotope.relative_atomic_mass(),
            Self::Mo(isotope) => isotope.relative_atomic_mass(),
            Self::Tc(isotope) => isotope.relative_atomic_mass(),
            Self::Ru(isotope) => isotope.relative_atomic_mass(),
            Self::Rh(isotope) => isotope.relative_atomic_mass(),
            Self::Pd(isotope) => isotope.relative_atomic_mass(),
            Self::Ag(isotope) => isotope.relative_atomic_mass(),
            Self::Cd(isotope) => isotope.relative_atomic_mass(),
            Self::In(isotope) => isotope.relative_atomic_mass(),
            Self::Sn(isotope) => isotope.relative_atomic_mass(),
            Self::Sb(isotope) => isotope.relative_atomic_mass(),
            Self::Te(isotope) => isotope.relative_atomic_mass(),
            Self::I(isotope) => isotope.relative_atomic_mass(),
            Self::Xe(isotope) => isotope.relative_atomic_mass(),
            Self::Cs(isotope) => isotope.relative_atomic_mass(),
            Self::Ba(isotope) => isotope.relative_atomic_mass(),
            Self::La(isotope) => isotope.relative_atomic_mass(),
            Self::Ce(isotope) => isotope.relative_atomic_mass(),
            Self::Pr(isotope) => isotope.relative_atomic_mass(),
            Self::Nd(isotope) => isotope.relative_atomic_mass(),
            Self::Pm(isotope) => isotope.relative_atomic_mass(),
            Self::Sm(isotope) => isotope.relative_atomic_mass(),
            Self::Eu(isotope) => isotope.relative_atomic_mass(),
            Self::Gd(isotope) => isotope.relative_atomic_mass(),
            Self::Tb(isotope) => isotope.relative_atomic_mass(),
            Self::Dy(isotope) => isotope.relative_atomic_mass(),
            Self::Ho(isotope) => isotope.relative_atomic_mass(),
            Self::Er(isotope) => isotope.relative_atomic_mass(),
            Self::Tm(isotope) => isotope.relative_atomic_mass(),
            Self::Yb(isotope) => isotope.relative_atomic_mass(),
            Self::Lu(isotope) => isotope.relative_atomic_mass(),
            Self::Hf(isotope) => isotope.relative_atomic_mass(),
            Self::Ta(isotope) => isotope.relative_atomic_mass(),
            Self::W(isotope) => isotope.relative_atomic_mass(),
            Self::Re(isotope) => isotope.relative_atomic_mass(),
            Self::Os(isotope) => isotope.relative_atomic_mass(),
            Self::Ir(isotope) => isotope.relative_atomic_mass(),
            Self::Pt(isotope) => isotope.relative_atomic_mass(),
            Self::Au(isotope) => isotope.relative_atomic_mass(),
            Self::Hg(isotope) => isotope.relative_atomic_mass(),
            Self::Tl(isotope) => isotope.relative_atomic_mass(),
            Self::Pb(isotope) => isotope.relative_atomic_mass(),
            Self::Bi(isotope) => isotope.relative_atomic_mass(),
            Self::Po(isotope) => isotope.relative_atomic_mass(),
            Self::At(isotope) => isotope.relative_atomic_mass(),
            Self::Rn(isotope) => isotope.relative_atomic_mass(),
            Self::Fr(isotope) => isotope.relative_atomic_mass(),
            Self::Ra(isotope) => isotope.relative_atomic_mass(),
            Self::Ac(isotope) => isotope.relative_atomic_mass(),
            Self::Th(isotope) => isotope.relative_atomic_mass(),
            Self::Pa(isotope) => isotope.relative_atomic_mass(),
            Self::U(isotope) => isotope.relative_atomic_mass(),
            Self::Np(isotope) => isotope.relative_atomic_mass(),
            Self::Pu(isotope) => isotope.relative_atomic_mass(),
            Self::Am(isotope) => isotope.relative_atomic_mass(),
            Self::Cm(isotope) => isotope.relative_atomic_mass(),
            Self::Bk(isotope) => isotope.relative_atomic_mass(),
            Self::Cf(isotope) => isotope.relative_atomic_mass(),
            Self::Es(isotope) => isotope.relative_atomic_mass(),
            Self::Fm(isotope) => isotope.relative_atomic_mass(),
            Self::Md(isotope) => isotope.relative_atomic_mass(),
            Self::No(isotope) => isotope.relative_atomic_mass(),
            Self::Lr(isotope) => isotope.relative_atomic_mass(),
            Self::Rf(isotope) => isotope.relative_atomic_mass(),
            Self::Db(isotope) => isotope.relative_atomic_mass(),
            Self::Sg(isotope) => isotope.relative_atomic_mass(),
            Self::Bh(isotope) => isotope.relative_atomic_mass(),
            Self::Hs(isotope) => isotope.relative_atomic_mass(),
            Self::Mt(isotope) => isotope.relative_atomic_mass(),
            Self::Ds(isotope) => isotope.relative_atomic_mass(),
            Self::Rg(isotope) => isotope.relative_atomic_mass(),
            Self::Cn(isotope) => isotope.relative_atomic_mass(),
            Self::Nh(isotope) => isotope.relative_atomic_mass(),
            Self::Fl(isotope) => isotope.relative_atomic_mass(),
            Self::Mc(isotope) => isotope.relative_atomic_mass(),
            Self::Lv(isotope) => isotope.relative_atomic_mass(),
            Self::Ts(isotope) => isotope.relative_atomic_mass(),
            Self::Og(isotope) => isotope.relative_atomic_mass(),
        }
    }
}

#[cfg(test)]
mod tests {
    use strum::IntoEnumIterator;

    use crate::isotopes::RelativeAtomicMass;

    #[test]
    fn test_relative_atomic_mass() {
        for element in crate::Element::iter() {
            let isotopes = element.isotopes();
            for isotope in isotopes {
                let mass = isotope.relative_atomic_mass();
                // Verify that relative atomic mass is positive and reasonable
                assert!(
                    mass > 0.0,
                    "Relative atomic mass for isotope {isotope:?} should be positive",
                );
                assert!(
                    mass < 300.0,
                    "Relative atomic mass for isotope {isotope:?} should be reasonable (< 300)",
                );
            }
        }
    }
}