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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use serde::{Deserialize, Serialize};
use std::str::FromStr;

#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum Element {
    H,
    C,
    O,
    N,
    P,
    S,
    Na,
    Mg,
    Cl,
    K,
    Ca,
    Fe,
    Mn,
    Co,
    Cr,
    I,
    Zn,
    Cu,
    F,
    Al,
    Se,
    V,
}

impl FromStr for Element {
    type Err = String;
    fn from_str(inp: &str) -> std::result::Result<Self, <Self as std::str::FromStr>::Err> {
        match inp {
            "H" => Ok(Element::H),
            "C" => Ok(Element::C),
            "O" => Ok(Element::O),
            "N" => Ok(Element::N),
            "P" => Ok(Element::P),
            "S" => Ok(Element::S),
            "Na" => Ok(Element::Na),
            "Mg" => Ok(Element::Mg),
            "Cl" => Ok(Element::Cl),
            "K" => Ok(Element::K),
            "Ca" => Ok(Element::Ca),
            "Fe" => Ok(Element::Fe),
            "Mn" => Ok(Element::Mn),
            "Co" => Ok(Element::Co),
            "Cr" => Ok(Element::Cr),
            "I" => Ok(Element::I),
            "Zn" => Ok(Element::Zn),
            "Cu" => Ok(Element::Cu),
            "F" => Ok(Element::F),
            "Al" => Ok(Element::Al),
            "Se" => Ok(Element::Se),
            "V" => Ok(Element::V),
            _ => Err(format!("Unknown atom name {}", inp)),
        }
    }
}