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
60
61
62
63
64
65
/// Bond
///
/// Struct for creating Bonds of type [BondOrder]
///
#[derive(Debug, PartialEq)]
pub struct Bond {
    atom1: i32,
    atom2: i32,
    order: BondOrder,
    // id
    // stereo
    // unique_id
    // has_setting
}

impl Bond {
    pub fn new(atom1: i32, atom2: i32, order: BondOrder) -> Self {
        Bond {
            atom1,
            atom2,
            order,
        }
    }
    pub fn get_atom_indices(&self) -> (i32, i32) {
        (self.atom1, self.atom2)
    }
}

#[repr(u8)]
#[derive(Debug, PartialEq)]
/// BondOrder:
///
/// Enum for defining Bond orders.
/// **Note: subject to change.**
/// Needs more research on which convention to follow.
/// - [biotite](https://www.biotite-python.org/latest/apidoc/biotite.structure.BondType.html#biotite.structure.BondType)
/// - see also [cdk](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/Bond.html)
pub enum BondOrder {
    /// Used if the actual type is unknown
    Unset,
    /// Single bond
    Single,
    /// Double bond
    Double,
    /// Triple bond
    Triple,
    /// A quadruple bond
    Quadruple,
}

impl BondOrder {
    pub fn match_bond(bond_int: i32) -> BondOrder {
        match bond_int {
            0 => BondOrder::Unset,
            1 => BondOrder::Single,
            2 => BondOrder::Double,
            3 => BondOrder::Triple,
            4 | 5 | 6 => BondOrder::Quadruple,
            _ => {
                println!("Bond Order not found: {}", bond_int);
                panic!()
            }
        }
    }
}