elements_rs/isotopes/
europium.rs

1//! Isotopes of the element Europium
2#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, strum :: EnumIter)]
3#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4/// Isotopes of the element Europium
5pub enum EuropiumIsotope {
6    /// Isotope Eu130 of Europium
7    Eu130,
8    /// Isotope Eu131 of Europium
9    Eu131,
10    /// Isotope Eu132 of Europium
11    Eu132,
12    /// Isotope Eu133 of Europium
13    Eu133,
14    /// Isotope Eu134 of Europium
15    Eu134,
16    /// Isotope Eu135 of Europium
17    Eu135,
18    /// Isotope Eu136 of Europium
19    Eu136,
20    /// Isotope Eu137 of Europium
21    Eu137,
22    /// Isotope Eu138 of Europium
23    Eu138,
24    /// Isotope Eu139 of Europium
25    Eu139,
26    /// Isotope Eu140 of Europium
27    Eu140,
28    /// Isotope Eu141 of Europium
29    Eu141,
30    /// Isotope Eu142 of Europium
31    Eu142,
32    /// Isotope Eu143 of Europium
33    Eu143,
34    /// Isotope Eu144 of Europium
35    Eu144,
36    /// Isotope Eu145 of Europium
37    Eu145,
38    /// Isotope Eu146 of Europium
39    Eu146,
40    /// Isotope Eu147 of Europium
41    Eu147,
42    /// Isotope Eu148 of Europium
43    Eu148,
44    /// Isotope Eu149 of Europium
45    Eu149,
46    /// Isotope Eu150 of Europium
47    Eu150,
48    /// Isotope Eu151 of Europium
49    Eu151,
50    /// Isotope Eu152 of Europium
51    Eu152,
52    /// Isotope Eu153 of Europium
53    Eu153,
54    /// Isotope Eu154 of Europium
55    Eu154,
56    /// Isotope Eu155 of Europium
57    Eu155,
58    /// Isotope Eu156 of Europium
59    Eu156,
60    /// Isotope Eu157 of Europium
61    Eu157,
62    /// Isotope Eu158 of Europium
63    Eu158,
64    /// Isotope Eu159 of Europium
65    Eu159,
66    /// Isotope Eu160 of Europium
67    Eu160,
68    /// Isotope Eu161 of Europium
69    Eu161,
70    /// Isotope Eu162 of Europium
71    Eu162,
72    /// Isotope Eu163 of Europium
73    Eu163,
74    /// Isotope Eu164 of Europium
75    Eu164,
76    /// Isotope Eu165 of Europium
77    Eu165,
78    /// Isotope Eu166 of Europium
79    Eu166,
80    /// Isotope Eu167 of Europium
81    Eu167,
82}
83impl super::RelativeAtomicMass for EuropiumIsotope {
84    #[inline]
85    fn relative_atomic_mass(&self) -> f64 {
86        match self {
87            Self::Eu130 => 129.96369f64,
88            Self::Eu131 => 130.95784f64,
89            Self::Eu132 => 131.95467f64,
90            Self::Eu133 => 132.94929f64,
91            Self::Eu134 => 133.9464f64,
92            Self::Eu135 => 134.94187f64,
93            Self::Eu136 => 135.93962f64,
94            Self::Eu137 => 136.93546f64,
95            Self::Eu138 => 137.933709f64,
96            Self::Eu139 => 138.929792f64,
97            Self::Eu140 => 139.928088f64,
98            Self::Eu141 => 140.924932f64,
99            Self::Eu142 => 141.923442f64,
100            Self::Eu143 => 142.920299f64,
101            Self::Eu144 => 143.91882f64,
102            Self::Eu145 => 144.9162726f64,
103            Self::Eu146 => 145.917211f64,
104            Self::Eu147 => 146.9167527f64,
105            Self::Eu148 => 147.918089f64,
106            Self::Eu149 => 148.9179378f64,
107            Self::Eu150 => 149.9197077f64,
108            Self::Eu151 => 150.9198578f64,
109            Self::Eu152 => 151.9217522f64,
110            Self::Eu153 => 152.921238f64,
111            Self::Eu154 => 153.922987f64,
112            Self::Eu155 => 154.9229011f64,
113            Self::Eu156 => 155.9247605f64,
114            Self::Eu157 => 156.9254334f64,
115            Self::Eu158 => 157.927799f64,
116            Self::Eu159 => 158.9291001f64,
117            Self::Eu160 => 159.931851f64,
118            Self::Eu161 => 160.933664f64,
119            Self::Eu162 => 161.936989f64,
120            Self::Eu163 => 162.939196f64,
121            Self::Eu164 => 163.94274f64,
122            Self::Eu165 => 164.94559f64,
123            Self::Eu166 => 165.94962f64,
124            Self::Eu167 => 166.95289f64,
125        }
126    }
127}
128impl super::ElementVariant for EuropiumIsotope {
129    #[inline]
130    fn element(&self) -> crate::Element {
131        crate::Element::Eu
132    }
133}
134impl super::MassNumber for EuropiumIsotope {
135    #[inline]
136    fn mass_number(&self) -> u16 {
137        match self {
138            Self::Eu130 => 130u16,
139            Self::Eu131 => 131u16,
140            Self::Eu132 => 132u16,
141            Self::Eu133 => 133u16,
142            Self::Eu134 => 134u16,
143            Self::Eu135 => 135u16,
144            Self::Eu136 => 136u16,
145            Self::Eu137 => 137u16,
146            Self::Eu138 => 138u16,
147            Self::Eu139 => 139u16,
148            Self::Eu140 => 140u16,
149            Self::Eu141 => 141u16,
150            Self::Eu142 => 142u16,
151            Self::Eu143 => 143u16,
152            Self::Eu144 => 144u16,
153            Self::Eu145 => 145u16,
154            Self::Eu146 => 146u16,
155            Self::Eu147 => 147u16,
156            Self::Eu148 => 148u16,
157            Self::Eu149 => 149u16,
158            Self::Eu150 => 150u16,
159            Self::Eu151 => 151u16,
160            Self::Eu152 => 152u16,
161            Self::Eu153 => 153u16,
162            Self::Eu154 => 154u16,
163            Self::Eu155 => 155u16,
164            Self::Eu156 => 156u16,
165            Self::Eu157 => 157u16,
166            Self::Eu158 => 158u16,
167            Self::Eu159 => 159u16,
168            Self::Eu160 => 160u16,
169            Self::Eu161 => 161u16,
170            Self::Eu162 => 162u16,
171            Self::Eu163 => 163u16,
172            Self::Eu164 => 164u16,
173            Self::Eu165 => 165u16,
174            Self::Eu166 => 166u16,
175            Self::Eu167 => 167u16,
176        }
177    }
178}
179impl super::IsotopicComposition for EuropiumIsotope {
180    #[inline]
181    fn isotopic_composition(&self) -> Option<f64> {
182        match self {
183            Self::Eu151 => Some(0.4781f64),
184            Self::Eu153 => Some(0.5219f64),
185            _ => None,
186        }
187    }
188}
189impl super::MostAbundantIsotope for EuropiumIsotope {
190    fn most_abundant_isotope() -> Self {
191        Self::Eu153
192    }
193}
194impl From<EuropiumIsotope> for crate::Isotope {
195    fn from(isotope: EuropiumIsotope) -> Self {
196        crate::Isotope::Eu(isotope)
197    }
198}
199impl From<EuropiumIsotope> for crate::Element {
200    fn from(_isotope: EuropiumIsotope) -> Self {
201        crate::Element::Eu
202    }
203}
204impl TryFrom<u64> for EuropiumIsotope {
205    type Error = crate::errors::Error;
206    fn try_from(value: u64) -> Result<Self, Self::Error> {
207        match value {
208            130u64 => Ok(Self::Eu130),
209            131u64 => Ok(Self::Eu131),
210            132u64 => Ok(Self::Eu132),
211            133u64 => Ok(Self::Eu133),
212            134u64 => Ok(Self::Eu134),
213            135u64 => Ok(Self::Eu135),
214            136u64 => Ok(Self::Eu136),
215            137u64 => Ok(Self::Eu137),
216            138u64 => Ok(Self::Eu138),
217            139u64 => Ok(Self::Eu139),
218            140u64 => Ok(Self::Eu140),
219            141u64 => Ok(Self::Eu141),
220            142u64 => Ok(Self::Eu142),
221            143u64 => Ok(Self::Eu143),
222            144u64 => Ok(Self::Eu144),
223            145u64 => Ok(Self::Eu145),
224            146u64 => Ok(Self::Eu146),
225            147u64 => Ok(Self::Eu147),
226            148u64 => Ok(Self::Eu148),
227            149u64 => Ok(Self::Eu149),
228            150u64 => Ok(Self::Eu150),
229            151u64 => Ok(Self::Eu151),
230            152u64 => Ok(Self::Eu152),
231            153u64 => Ok(Self::Eu153),
232            154u64 => Ok(Self::Eu154),
233            155u64 => Ok(Self::Eu155),
234            156u64 => Ok(Self::Eu156),
235            157u64 => Ok(Self::Eu157),
236            158u64 => Ok(Self::Eu158),
237            159u64 => Ok(Self::Eu159),
238            160u64 => Ok(Self::Eu160),
239            161u64 => Ok(Self::Eu161),
240            162u64 => Ok(Self::Eu162),
241            163u64 => Ok(Self::Eu163),
242            164u64 => Ok(Self::Eu164),
243            165u64 => Ok(Self::Eu165),
244            166u64 => Ok(Self::Eu166),
245            167u64 => Ok(Self::Eu167),
246            _ => Err(crate::errors::Error::Isotope(crate::Element::Eu, value)),
247        }
248    }
249}
250impl TryFrom<u8> for EuropiumIsotope {
251    type Error = crate::errors::Error;
252    fn try_from(value: u8) -> Result<Self, Self::Error> {
253        Self::try_from(u64::from(value))
254    }
255}
256impl TryFrom<u16> for EuropiumIsotope {
257    type Error = crate::errors::Error;
258    fn try_from(value: u16) -> Result<Self, Self::Error> {
259        Self::try_from(u64::from(value))
260    }
261}
262impl TryFrom<u32> for EuropiumIsotope {
263    type Error = crate::errors::Error;
264    fn try_from(value: u32) -> Result<Self, Self::Error> {
265        Self::try_from(u64::from(value))
266    }
267}
268impl core::fmt::Display for EuropiumIsotope {
269    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
270        match self {
271            Self::Eu130 => write!(f, "Eu130"),
272            Self::Eu131 => write!(f, "Eu131"),
273            Self::Eu132 => write!(f, "Eu132"),
274            Self::Eu133 => write!(f, "Eu133"),
275            Self::Eu134 => write!(f, "Eu134"),
276            Self::Eu135 => write!(f, "Eu135"),
277            Self::Eu136 => write!(f, "Eu136"),
278            Self::Eu137 => write!(f, "Eu137"),
279            Self::Eu138 => write!(f, "Eu138"),
280            Self::Eu139 => write!(f, "Eu139"),
281            Self::Eu140 => write!(f, "Eu140"),
282            Self::Eu141 => write!(f, "Eu141"),
283            Self::Eu142 => write!(f, "Eu142"),
284            Self::Eu143 => write!(f, "Eu143"),
285            Self::Eu144 => write!(f, "Eu144"),
286            Self::Eu145 => write!(f, "Eu145"),
287            Self::Eu146 => write!(f, "Eu146"),
288            Self::Eu147 => write!(f, "Eu147"),
289            Self::Eu148 => write!(f, "Eu148"),
290            Self::Eu149 => write!(f, "Eu149"),
291            Self::Eu150 => write!(f, "Eu150"),
292            Self::Eu151 => write!(f, "Eu151"),
293            Self::Eu152 => write!(f, "Eu152"),
294            Self::Eu153 => write!(f, "Eu153"),
295            Self::Eu154 => write!(f, "Eu154"),
296            Self::Eu155 => write!(f, "Eu155"),
297            Self::Eu156 => write!(f, "Eu156"),
298            Self::Eu157 => write!(f, "Eu157"),
299            Self::Eu158 => write!(f, "Eu158"),
300            Self::Eu159 => write!(f, "Eu159"),
301            Self::Eu160 => write!(f, "Eu160"),
302            Self::Eu161 => write!(f, "Eu161"),
303            Self::Eu162 => write!(f, "Eu162"),
304            Self::Eu163 => write!(f, "Eu163"),
305            Self::Eu164 => write!(f, "Eu164"),
306            Self::Eu165 => write!(f, "Eu165"),
307            Self::Eu166 => write!(f, "Eu166"),
308            Self::Eu167 => write!(f, "Eu167"),
309        }
310    }
311}
312#[cfg(test)]
313mod tests {
314    use strum::IntoEnumIterator;
315
316    use super::*;
317    use crate::isotopes::{
318        ElementVariant, IsotopicComposition, MassNumber, MostAbundantIsotope, RelativeAtomicMass,
319    };
320    #[test]
321    fn test_relative_atomic_mass() {
322        for isotope in EuropiumIsotope::iter() {
323            let mass = isotope.relative_atomic_mass();
324            assert!(mass > 0.0, "Mass should be positive for {isotope:?}");
325        }
326    }
327    #[test]
328    fn test_element() {
329        for isotope in EuropiumIsotope::iter() {
330            let element = isotope.element();
331            assert_eq!(element, crate::Element::Eu, "Element should be correct for {isotope:?}");
332        }
333    }
334    #[test]
335    fn test_mass_number() {
336        for isotope in EuropiumIsotope::iter() {
337            let mass_number = isotope.mass_number();
338            assert!(
339                mass_number > 0 && mass_number < 300,
340                "Mass number should be reasonable for {isotope:?}"
341            );
342        }
343    }
344    #[test]
345    fn test_isotopic_composition() {
346        for isotope in EuropiumIsotope::iter() {
347            let comp = isotope.isotopic_composition();
348            if let Some(c) = comp {
349                assert!(
350                    (0.0..=1.0).contains(&c),
351                    "Composition should be between 0 and 1 for {isotope:?}"
352                );
353            }
354        }
355    }
356    #[test]
357    fn test_most_abundant() {
358        let most_abundant = EuropiumIsotope::most_abundant_isotope();
359        let _ = most_abundant.relative_atomic_mass();
360    }
361    #[test]
362    fn test_from_isotope() {
363        for isotope in EuropiumIsotope::iter() {
364            let iso: crate::Isotope = isotope.into();
365            match iso {
366                crate::Isotope::Eu(i) => assert_eq!(i, isotope),
367                _ => panic!("Wrong isotope type"),
368            }
369        }
370    }
371    #[test]
372    fn test_from_element() {
373        for isotope in EuropiumIsotope::iter() {
374            let elem: crate::Element = isotope.into();
375            assert_eq!(elem, crate::Element::Eu);
376        }
377    }
378    #[test]
379    fn test_try_from_mass_number() {
380        for isotope in EuropiumIsotope::iter() {
381            let mass = isotope.mass_number();
382            let iso = EuropiumIsotope::try_from(mass).unwrap();
383            assert_eq!(iso, isotope);
384            let iso_u32 = EuropiumIsotope::try_from(u32::from(mass)).unwrap();
385            assert_eq!(iso_u32, isotope);
386            if let Ok(mass_u8) = u8::try_from(mass) {
387                let iso_u8 = EuropiumIsotope::try_from(mass_u8).unwrap();
388                assert_eq!(iso_u8, isotope);
389            }
390        }
391        assert!(EuropiumIsotope::try_from(0_u16).is_err());
392        assert!(EuropiumIsotope::try_from(1000_u16).is_err());
393        assert!(EuropiumIsotope::try_from(0_u32).is_err());
394        assert!(EuropiumIsotope::try_from(1000_u32).is_err());
395        assert!(EuropiumIsotope::try_from(0_u8).is_err());
396    }
397    #[test]
398    fn test_display() {
399        for isotope in EuropiumIsotope::iter() {
400            let s = alloc::format!("{isotope}");
401            assert!(!s.is_empty(), "Display should not be empty for {isotope:?}");
402        }
403    }
404}