chemrust_core/data/
lattice_model.rs

1use super::atom::CoreAtomData;
2use super::lattice::UnitCellParameters;
3use super::symmetry::SymmetryInfo;
4use crystallographic_group::database::SpaceGroupHallSymbol;
5/// Minimal data struct to represent a lattice model.
6/// This is made for internal data operations between downstream crates based on
7/// this crate.
8#[derive(Debug, Clone)]
9pub struct LatticeModel<U: UnitCellParameters, C: CoreAtomData> {
10    lattice_param: U,
11    atoms: C,
12    space_group: SpaceGroupHallSymbol,
13}
14
15impl<U: UnitCellParameters, C: CoreAtomData> LatticeModel<U, C> {
16    pub fn lattice_param(&self) -> &U {
17        &self.lattice_param
18    }
19
20    pub fn atoms(&self) -> &C {
21        &self.atoms
22    }
23
24    pub fn space_group(&self) -> SpaceGroupHallSymbol {
25        self.space_group
26    }
27}
28
29impl<U: UnitCellParameters, C: CoreAtomData> SymmetryInfo for LatticeModel<U, C> {
30    fn make_symmetry(&self) -> bool {
31        !matches!(self.space_group, SpaceGroupHallSymbol::P_1)
32    }
33
34    fn get_space_group_it_num(&self) -> u8 {
35        let number_code = self.space_group.get_space_group_number_code();
36        if number_code.contains(":") {
37            number_code
38                .split(":")
39                .next()
40                .and_then(|v| v.parse::<u8>().ok())
41                .expect("The space group number (1-230) should be within range of `u8`")
42        } else {
43            number_code
44                .parse::<u8>()
45                .expect("The space group number (1-230) should be within range of `u8`")
46        }
47    }
48}