1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, strum :: EnumIter)]
3#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4pub enum EuropiumIsotope {
6 Eu130,
8 Eu131,
10 Eu132,
12 Eu133,
14 Eu134,
16 Eu135,
18 Eu136,
20 Eu137,
22 Eu138,
24 Eu139,
26 Eu140,
28 Eu141,
30 Eu142,
32 Eu143,
34 Eu144,
36 Eu145,
38 Eu146,
40 Eu147,
42 Eu148,
44 Eu149,
46 Eu150,
48 Eu151,
50 Eu152,
52 Eu153,
54 Eu154,
56 Eu155,
58 Eu156,
60 Eu157,
62 Eu158,
64 Eu159,
66 Eu160,
68 Eu161,
70 Eu162,
72 Eu163,
74 Eu164,
76 Eu165,
78 Eu166,
80 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}