Skip to main content

use_atomic_mass/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4//! Average atomic mass helpers backed by static element data.
5
6use use_element::{element_by_atomic_number, element_by_symbol};
7
8/// Looks up the average atomic mass for an element symbol.
9///
10/// # Examples
11///
12/// ```rust
13/// use use_atomic_mass::atomic_mass_by_symbol;
14///
15/// assert!((atomic_mass_by_symbol("C").unwrap() - 12.011).abs() < 0.01);
16/// assert!(atomic_mass_by_symbol("??").is_none());
17/// ```
18#[must_use]
19pub fn atomic_mass_by_symbol(symbol: &str) -> Option<f64> {
20    element_by_symbol(symbol).map(|element| element.atomic_mass)
21}
22
23/// Looks up the average atomic mass for an atomic number.
24#[must_use]
25pub fn atomic_mass_by_atomic_number(atomic_number: u8) -> Option<f64> {
26    element_by_atomic_number(atomic_number).map(|element| element.atomic_mass)
27}
28
29/// Named alias for average atomic mass lookup by symbol.
30#[must_use]
31pub fn average_atomic_mass(symbol: &str) -> Option<f64> {
32    atomic_mass_by_symbol(symbol)
33}
34
35/// Returns the elemental molar mass in grams per mole.
36#[must_use]
37pub fn molar_mass_element(symbol: &str) -> Option<f64> {
38    atomic_mass_by_symbol(symbol)
39}
40
41#[cfg(test)]
42mod tests {
43    use super::{
44        atomic_mass_by_atomic_number, atomic_mass_by_symbol, average_atomic_mass,
45        molar_mass_element,
46    };
47
48    fn assert_close(left: f64, right: f64) {
49        assert!((left - right).abs() < 0.02, "left={left}, right={right}");
50    }
51
52    #[test]
53    fn looks_up_expected_atomic_masses_by_symbol() {
54        assert_close(atomic_mass_by_symbol("H").unwrap_or_default(), 1.008);
55        assert_close(atomic_mass_by_symbol("C").unwrap_or_default(), 12.011);
56        assert_close(atomic_mass_by_symbol("O").unwrap_or_default(), 15.999);
57        assert_close(atomic_mass_by_symbol("Na").unwrap_or_default(), 22.990);
58        assert_close(atomic_mass_by_symbol("Fe").unwrap_or_default(), 55.845);
59        assert_close(atomic_mass_by_symbol("Au").unwrap_or_default(), 196.97);
60        assert_close(atomic_mass_by_symbol("U").unwrap_or_default(), 238.03);
61        assert_close(atomic_mass_by_symbol("Og").unwrap_or_default(), 294.0);
62        assert_eq!(atomic_mass_by_symbol("invalid"), None);
63    }
64
65    #[test]
66    fn looks_up_expected_atomic_masses_by_atomic_number() {
67        assert_close(atomic_mass_by_atomic_number(1).unwrap_or_default(), 1.008);
68        assert_close(atomic_mass_by_atomic_number(6).unwrap_or_default(), 12.011);
69        assert_close(atomic_mass_by_atomic_number(8).unwrap_or_default(), 15.999);
70        assert_close(atomic_mass_by_atomic_number(11).unwrap_or_default(), 22.990);
71        assert_close(atomic_mass_by_atomic_number(26).unwrap_or_default(), 55.845);
72        assert_close(atomic_mass_by_atomic_number(79).unwrap_or_default(), 196.97);
73        assert_close(atomic_mass_by_atomic_number(92).unwrap_or_default(), 238.03);
74        assert_close(atomic_mass_by_atomic_number(118).unwrap_or_default(), 294.0);
75        assert_eq!(atomic_mass_by_atomic_number(0), None);
76        assert_eq!(atomic_mass_by_atomic_number(119), None);
77    }
78
79    #[test]
80    fn exposes_average_and_molar_mass_aliases() {
81        assert_close(average_atomic_mass("O").unwrap_or_default(), 15.999);
82        assert_close(molar_mass_element("Na").unwrap_or_default(), 22.990);
83        assert_eq!(average_atomic_mass("bad"), None);
84        assert_eq!(molar_mass_element("bad"), None);
85    }
86}