Skip to main content

mindat_rs/models/
crystallography.rs

1//! Crystallography types for the Mindat API: crystal classes, space groups,
2//! and space-group sets.
3
4use serde::{Deserialize, Serialize};
5
6use super::serde_helpers::{deserialize_i32, deserialize_optional_i32};
7
8/// A crystal class / point group (`/crystalclasses/`).
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct CrystalClass {
11    /// Crystal class ID.
12    #[serde(deserialize_with = "deserialize_i32")]
13    pub id: i32,
14    /// Crystal system.
15    #[serde(default)]
16    pub system: Option<String>,
17    /// Hermann–Mauguin symbol.
18    #[serde(default)]
19    pub symbol: Option<String>,
20    /// Class name.
21    #[serde(default)]
22    pub name: Option<String>,
23}
24
25/// A space group (`/spacegroups/`).
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct SpaceGroup {
28    /// Space group ID.
29    #[serde(deserialize_with = "deserialize_i32")]
30    pub id: i32,
31    /// Crystal class ID.
32    #[serde(default, deserialize_with = "deserialize_optional_i32")]
33    pub cclass: Option<i32>,
34    /// Space group symbol/text.
35    #[serde(default)]
36    pub sgtext: Option<String>,
37}
38
39/// A space group setting (`/spacegroupsets/`).
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct SpaceGroupSet {
42    /// Space group set ID.
43    #[serde(deserialize_with = "deserialize_i32")]
44    pub id: i32,
45    /// Space group ID.
46    #[serde(default, deserialize_with = "deserialize_optional_i32")]
47    pub spacegroup: Option<i32>,
48    /// Crystal class ID.
49    #[serde(default, deserialize_with = "deserialize_optional_i32")]
50    pub cclass: Option<i32>,
51    /// Space group set symbol/text.
52    #[serde(default)]
53    pub sgstext: Option<String>,
54}
55
56/// Builder for `/crystalclasses/` query parameters.
57#[derive(Debug, Clone, Default)]
58pub struct CrystalClassesQuery {
59    /// Filter by crystal system.
60    pub system: Option<String>,
61    /// Filter by symbol.
62    pub symbol: Option<String>,
63    /// Filter by a set of IDs.
64    pub id_in: Option<Vec<i32>>,
65    /// Page number.
66    pub page: Option<i32>,
67    /// Page size.
68    pub page_size: Option<i32>,
69}
70
71impl CrystalClassesQuery {
72    /// Create a new empty query.
73    pub fn new() -> Self {
74        Self::default()
75    }
76
77    /// Filter by crystal system.
78    pub fn system(mut self, system: impl Into<String>) -> Self {
79        self.system = Some(system.into());
80        self
81    }
82
83    /// Set page number.
84    pub fn page(mut self, page: i32) -> Self {
85        self.page = Some(page);
86        self
87    }
88
89    /// Set page size.
90    pub fn page_size(mut self, size: i32) -> Self {
91        self.page_size = Some(size);
92        self
93    }
94}
95
96/// Builder for `/spacegroups/` query parameters.
97#[derive(Debug, Clone, Default)]
98pub struct SpaceGroupsQuery {
99    /// Filter by crystal class ID.
100    pub cclass: Option<i32>,
101    /// Filter by space group text.
102    pub sgtext: Option<String>,
103    /// Filter by a set of IDs.
104    pub id_in: Option<Vec<i32>>,
105    /// Page number.
106    pub page: Option<i32>,
107    /// Page size.
108    pub page_size: Option<i32>,
109}
110
111impl SpaceGroupsQuery {
112    /// Create a new empty query.
113    pub fn new() -> Self {
114        Self::default()
115    }
116
117    /// Filter by crystal class ID.
118    pub fn crystal_class(mut self, cclass: i32) -> Self {
119        self.cclass = Some(cclass);
120        self
121    }
122
123    /// Set page number.
124    pub fn page(mut self, page: i32) -> Self {
125        self.page = Some(page);
126        self
127    }
128
129    /// Set page size.
130    pub fn page_size(mut self, size: i32) -> Self {
131        self.page_size = Some(size);
132        self
133    }
134}