1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use alloc::fmt::{Display, Error, Formatter};
use core::str::FromStr;
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Mass {
Average(f32),
MostStable(u16),
}
impl FromStr for Mass {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.starts_with('[') {
if let Ok(stable) = s[1..s.len() - 1].parse() {
return Ok(Mass::MostStable(stable));
}
} else if let Ok(average) = s[0..s.find('(').unwrap_or_else(|| s.len())].parse() {
return Ok(Mass::Average(average));
}
Err(())
}
}
impl Display for Mass {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match self {
Mass::Average(avg) => write!(f, "{}", avg),
Mass::MostStable(stable) => write!(f, "({})", stable),
}
}
}