elements_rs 0.2.6

A comprehensive library for chemical elements and their isotopes with rich metadata
Documentation
//! Principal quantum number (electron shell number) for elements.

use crate::isotopes::ElementVariant;

/// Number of electron shells in the atom.
pub trait PrincipalQuantumNumber {
    /// Returns the principal quantum number (shell number).
    ///
    /// # Examples
    ///
    /// ```rust
    /// use elements_rs::{Element, PrincipalQuantumNumber};
    ///
    /// assert_eq!(Element::H.principal_quantum_number(), 1);
    /// assert_eq!(Element::Li.principal_quantum_number(), 2);
    /// ```
    fn principal_quantum_number(&self) -> u8;
}

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

impl PrincipalQuantumNumber for crate::Isotope {
    fn principal_quantum_number(&self) -> u8 {
        self.element().principal_quantum_number()
    }
}

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

    use super::PrincipalQuantumNumber;

    #[test]
    fn test_principal_quantum_number() {
        for element in crate::Element::iter() {
            let n = element.principal_quantum_number();
            assert!(
                (1..=7).contains(&n),
                "Principal quantum number should be between 1 and 7 for {element:?}",
            );
        }
    }

    #[test]
    fn test_isotope_principal_quantum_number() {
        for element in crate::Element::iter() {
            let element_number = element.principal_quantum_number();
            let isotopes = element.isotopes();
            for isotope in isotopes {
                let isotope_number = isotope.principal_quantum_number();
                assert_eq!(
                    element_number, isotope_number,
                    "Principal quantum number mismatch for isotope {isotope:?} of element {element:?}",
                );
            }
        }
    }
}