mindat_rs/models/
minerals_ima.rs

1//! IMA Mineral types for the Mindat API.
2
3use serde::{Deserialize, Serialize};
4
5use super::serde_helpers::{deserialize_optional_vec_i32, deserialize_optional_vec_string};
6
7/// An IMA-approved mineral from the Mindat database.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ImaMaterial {
10    /// Mindat ID.
11    pub id: i32,
12    /// Mineral name.
13    #[serde(default)]
14    pub name: Option<String>,
15    /// IMA-approved formula.
16    #[serde(default)]
17    pub ima_formula: Option<String>,
18    /// IMA symbol (3 letters).
19    #[serde(default)]
20    pub ima_symbol: Option<String>,
21    /// IMA approval year.
22    #[serde(default)]
23    pub ima_year: Option<String>,
24    /// Discovery year.
25    #[serde(default)]
26    pub discovery_year: Option<String>,
27    /// IMA status values.
28    #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
29    pub ima_status: Option<Vec<String>>,
30    /// IMA notes.
31    #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
32    pub ima_notes: Option<Vec<String>>,
33    /// Type specimen storage location.
34    #[serde(default)]
35    pub type_specimen_store: Option<String>,
36    /// Mindat long ID.
37    #[serde(default)]
38    pub mindat_longid: Option<String>,
39    /// Mindat GUID.
40    #[serde(default)]
41    pub mindat_guid: Option<String>,
42    /// Type localities.
43    #[serde(default, deserialize_with = "deserialize_optional_vec_i32")]
44    pub type_localities: Option<Vec<i32>>,
45    /// Short description.
46    #[serde(default)]
47    pub description_short: Option<String>,
48    /// Mindat formula.
49    #[serde(default)]
50    pub mindat_formula: Option<String>,
51    /// Mindat formula note.
52    #[serde(default)]
53    pub mindat_formula_note: Option<String>,
54}
55
56/// Builder for IMA minerals query parameters.
57#[derive(Debug, Clone, Default)]
58pub struct ImaMineralsQuery {
59    /// Search query.
60    pub q: Option<String>,
61    /// IMA filter.
62    pub ima: Option<i32>,
63    /// Filter by IDs.
64    pub id_in: Option<Vec<i32>>,
65    /// Updated after datetime.
66    pub updated_at: Option<String>,
67    /// Fields to include.
68    pub fields: Option<String>,
69    /// Fields to omit.
70    pub omit: Option<String>,
71    /// Fields to expand.
72    pub expand: Option<Vec<String>>,
73    /// Page number.
74    pub page: Option<i32>,
75    /// Page size.
76    pub page_size: Option<i32>,
77}
78
79impl ImaMineralsQuery {
80    /// Create a new empty query.
81    pub fn new() -> Self {
82        Self::default()
83    }
84
85    /// Search query.
86    pub fn search(mut self, q: impl Into<String>) -> Self {
87        self.q = Some(q.into());
88        self
89    }
90
91    /// Select specific fields.
92    pub fn select_fields(mut self, fields: impl Into<String>) -> Self {
93        self.fields = Some(fields.into());
94        self
95    }
96
97    /// Omit specific fields.
98    pub fn omit_fields(mut self, fields: impl Into<String>) -> Self {
99        self.omit = Some(fields.into());
100        self
101    }
102
103    /// Expand related fields.
104    pub fn expand_fields(mut self, fields: Vec<String>) -> Self {
105        self.expand = Some(fields);
106        self
107    }
108
109    /// Set page number.
110    pub fn page(mut self, page: i32) -> Self {
111        self.page = Some(page);
112        self
113    }
114
115    /// Set page size.
116    pub fn page_size(mut self, size: i32) -> Self {
117        self.page_size = Some(size);
118        self
119    }
120}