1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_element::{element_by_atomic_number, element_by_symbol};
7
8#[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#[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#[must_use]
31pub fn average_atomic_mass(symbol: &str) -> Option<f64> {
32 atomic_mass_by_symbol(symbol)
33}
34
35#[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}