mindat_rs/models/
localities.rs

1//! Locality types for the Mindat API.
2
3use serde::{Deserialize, Serialize};
4
5use super::serde_helpers::{
6    deserialize_optional_f64, deserialize_optional_i16, deserialize_optional_i32,
7    deserialize_optional_vec_i32,
8};
9
10/// A locality from the Mindat database.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Locality {
13    /// Mindat ID.
14    pub id: i32,
15    /// Long ID string.
16    #[serde(default)]
17    pub longid: Option<String>,
18    /// GUID.
19    #[serde(default)]
20    pub guid: Option<String>,
21    /// Locality text/name.
22    #[serde(default)]
23    pub txt: Option<String>,
24    /// Reversed text description.
25    #[serde(default)]
26    pub revtxtd: Option<String>,
27    /// Short description.
28    #[serde(default)]
29    pub description_short: Option<String>,
30    /// Latitude.
31    #[serde(default, deserialize_with = "deserialize_optional_f64")]
32    pub latitude: Option<f64>,
33    /// Longitude.
34    #[serde(default, deserialize_with = "deserialize_optional_f64")]
35    pub longitude: Option<f64>,
36    /// Language-specific text.
37    #[serde(default)]
38    pub langtxt: Option<String>,
39    /// Date added.
40    #[serde(default)]
41    pub dateadd: Option<String>,
42    /// Date modified.
43    #[serde(default)]
44    pub datemodify: Option<String>,
45    /// Elements found at this locality.
46    #[serde(default)]
47    pub elements: Option<String>,
48    /// Country name.
49    #[serde(default)]
50    pub country: Option<String>,
51    /// References.
52    #[serde(default)]
53    pub refs: Option<String>,
54    /// Coordinate system.
55    #[serde(default, deserialize_with = "deserialize_optional_i32")]
56    pub coordsystem: Option<i32>,
57    /// Parent locality ID.
58    #[serde(default, deserialize_with = "deserialize_optional_i32")]
59    pub parent: Option<i32>,
60    /// Links.
61    #[serde(default)]
62    pub links: Option<String>,
63    /// Area.
64    #[serde(default, deserialize_with = "deserialize_optional_i32")]
65    pub area: Option<i32>,
66    /// Non-hierarchical flag.
67    #[serde(default, deserialize_with = "deserialize_optional_i32")]
68    pub non_hierarchical: Option<i32>,
69    /// Age ID.
70    #[serde(default, deserialize_with = "deserialize_optional_i32")]
71    pub age: Option<i32>,
72    /// Meteorite type.
73    #[serde(default, deserialize_with = "deserialize_optional_i32")]
74    pub meteorite_type: Option<i32>,
75    /// Company ID.
76    #[serde(default, deserialize_with = "deserialize_optional_i32")]
77    pub company: Option<i32>,
78    /// Company 2 ID.
79    #[serde(default, deserialize_with = "deserialize_optional_i32")]
80    pub company2: Option<i32>,
81    /// Locality status ID.
82    #[serde(default, deserialize_with = "deserialize_optional_i32")]
83    pub loc_status: Option<i32>,
84    /// Locality group.
85    #[serde(default, deserialize_with = "deserialize_optional_i32")]
86    pub loc_group: Option<i32>,
87    /// Status year.
88    #[serde(default)]
89    pub status_year: Option<String>,
90    /// Company year.
91    #[serde(default)]
92    pub company_year: Option<String>,
93    /// Discovered before.
94    #[serde(default, deserialize_with = "deserialize_optional_i32")]
95    pub discovered_before: Option<i32>,
96    /// Discovery year.
97    #[serde(default, deserialize_with = "deserialize_optional_i32")]
98    pub discovery_year: Option<i32>,
99    /// Discovery year type.
100    #[serde(default)]
101    pub discovery_year_type: Option<String>,
102    /// Hierarchy level.
103    #[serde(default, deserialize_with = "deserialize_optional_i32")]
104    pub level: Option<i32>,
105    /// Included localities.
106    #[serde(default)]
107    pub locsinclude: Option<String>,
108    /// Excluded localities.
109    #[serde(default)]
110    pub locsexclude: Option<String>,
111    /// Wikipedia link.
112    #[serde(default)]
113    pub wikipedia: Option<String>,
114    /// OSM ID.
115    #[serde(default)]
116    pub osmid: Option<String>,
117    /// Geonames ID.
118    #[serde(default, deserialize_with = "deserialize_optional_i32")]
119    pub geonames: Option<i32>,
120    /// Timestamp.
121    #[serde(default)]
122    pub timestamp: Option<String>,
123    /// Geomaterials at this locality (when expanded).
124    #[serde(default, deserialize_with = "deserialize_optional_vec_i32")]
125    pub geomaterials: Option<Vec<i32>>,
126}
127
128/// Builder for locality query parameters.
129#[derive(Debug, Clone, Default)]
130pub struct LocalitiesQuery {
131    /// Country name filter.
132    pub country: Option<String>,
133    /// Locality name contains.
134    pub txt: Option<String>,
135    /// Description contains.
136    pub description: Option<String>,
137    /// Include elements (comma-separated).
138    pub elements_inc: Option<String>,
139    /// Exclude elements (comma-separated).
140    pub elements_exc: Option<String>,
141    /// Filter by IDs.
142    pub id_in: Option<Vec<i32>>,
143    /// Updated after datetime.
144    pub updated_at: Option<String>,
145    /// Fields to include.
146    pub fields: Option<String>,
147    /// Fields to omit.
148    pub omit: Option<String>,
149    /// Fields to expand.
150    pub expand: Option<Vec<String>>,
151    /// Cursor for pagination.
152    pub cursor: Option<String>,
153    /// Page size (number of results per page).
154    pub page_size: Option<i32>,
155    /// Page number for pagination.
156    pub page: Option<i32>,
157}
158
159impl LocalitiesQuery {
160    /// Create a new empty query.
161    pub fn new() -> Self {
162        Self::default()
163    }
164
165    /// Filter by country name.
166    pub fn country(mut self, country: impl Into<String>) -> Self {
167        self.country = Some(country.into());
168        self
169    }
170
171    /// Filter by locality name.
172    pub fn name_contains(mut self, txt: impl Into<String>) -> Self {
173        self.txt = Some(txt.into());
174        self
175    }
176
177    /// Filter by description.
178    pub fn description_contains(mut self, desc: impl Into<String>) -> Self {
179        self.description = Some(desc.into());
180        self
181    }
182
183    /// Filter by included elements.
184    pub fn with_elements(mut self, elements: impl Into<String>) -> Self {
185        self.elements_inc = Some(elements.into());
186        self
187    }
188
189    /// Filter by excluded elements.
190    pub fn without_elements(mut self, elements: impl Into<String>) -> Self {
191        self.elements_exc = Some(elements.into());
192        self
193    }
194
195    /// Select specific fields.
196    pub fn select_fields(mut self, fields: impl Into<String>) -> Self {
197        self.fields = Some(fields.into());
198        self
199    }
200
201    /// Omit specific fields.
202    pub fn omit_fields(mut self, fields: impl Into<String>) -> Self {
203        self.omit = Some(fields.into());
204        self
205    }
206
207    /// Expand related fields.
208    pub fn expand_fields(mut self, fields: Vec<String>) -> Self {
209        self.expand = Some(fields);
210        self
211    }
212
213    /// Set cursor for pagination.
214    pub fn cursor(mut self, cursor: impl Into<String>) -> Self {
215        self.cursor = Some(cursor.into());
216        self
217    }
218
219    /// Set page size (number of results per page).
220    pub fn page_size(mut self, size: i32) -> Self {
221        self.page_size = Some(size);
222        self
223    }
224
225    /// Set page number for pagination.
226    pub fn page(mut self, page: i32) -> Self {
227        self.page = Some(page);
228        self
229    }
230}
231
232/// Locality age information.
233#[derive(Debug, Clone, Serialize, Deserialize)]
234pub struct LocalityAge {
235    /// Age ID.
236    pub age_id: i32,
237    /// Age MA value.
238    #[serde(default, deserialize_with = "deserialize_optional_f64")]
239    pub age_mav: Option<f64>,
240    /// Age PM value.
241    #[serde(default, deserialize_with = "deserialize_optional_f64")]
242    pub age_pmv: Option<f64>,
243    /// Age MA2 value.
244    #[serde(default, deserialize_with = "deserialize_optional_f64")]
245    pub age_ma2v: Option<f64>,
246    /// Age PM2 value.
247    #[serde(default, deserialize_with = "deserialize_optional_f64")]
248    pub age_pm2v: Option<f64>,
249    /// Age method.
250    #[serde(default)]
251    pub agemethod: Option<String>,
252    /// Age reference.
253    #[serde(default)]
254    pub agereference: Option<String>,
255    /// Age MA string.
256    #[serde(default)]
257    pub age_ma: Option<String>,
258    /// Age PM string.
259    #[serde(default)]
260    pub age_pm: Option<String>,
261    /// Age MA2 string.
262    #[serde(default)]
263    pub age_ma2: Option<String>,
264    /// Age PM2 string.
265    #[serde(default)]
266    pub age_pm2: Option<String>,
267    /// Ages 1.
268    #[serde(default, deserialize_with = "deserialize_optional_i32")]
269    pub ages1: Option<i32>,
270    /// Ages 2.
271    #[serde(default, deserialize_with = "deserialize_optional_i32")]
272    pub ages2: Option<i32>,
273    /// Age type.
274    #[serde(default, deserialize_with = "deserialize_optional_i32")]
275    pub age_type: Option<i32>,
276}
277
278/// Locality status information.
279#[derive(Debug, Clone, Serialize, Deserialize)]
280pub struct LocalityStatus {
281    /// Status ID.
282    pub ls_id: i32,
283    /// Status text.
284    pub ls_text: String,
285    /// Historical flag.
286    #[serde(default, deserialize_with = "deserialize_optional_i32")]
287    pub ls_historical: Option<i32>,
288    /// Wide flag.
289    #[serde(default, deserialize_with = "deserialize_optional_i32")]
290    pub ls_wide: Option<i32>,
291}
292
293/// Locality type information.
294#[derive(Debug, Clone, Serialize, Deserialize)]
295pub struct LocalityType {
296    /// Type ID.
297    pub lt_id: i32,
298    /// Type text.
299    pub lt_text: String,
300    /// Parent type ID.
301    #[serde(default, deserialize_with = "deserialize_optional_i32")]
302    pub lt_parent: Option<i32>,
303    /// Sort order.
304    #[serde(default, deserialize_with = "deserialize_optional_i16")]
305    pub lt_sortorder: Option<i16>,
306    /// Erratic flag.
307    #[serde(default, deserialize_with = "deserialize_optional_i32")]
308    pub lt_erratic: Option<i32>,
309    /// Area flag.
310    #[serde(default, deserialize_with = "deserialize_optional_i32")]
311    pub lt_area: Option<i32>,
312    /// Underground flag.
313    #[serde(default, deserialize_with = "deserialize_optional_i32")]
314    pub lt_underground: Option<i32>,
315}
316
317/// Geographic region (with GeoJSON geometry).
318#[derive(Debug, Clone, Serialize, Deserialize)]
319pub struct GeoRegion {
320    /// Region ID.
321    pub id: i32,
322    /// Region text.
323    #[serde(default)]
324    pub lgr_revtxtd: Option<String>,
325    /// Update time.
326    #[serde(default)]
327    pub lgr_updttime: Option<String>,
328    /// Non-hierarchical flag.
329    #[serde(default, deserialize_with = "deserialize_optional_i32")]
330    pub lgr_non_hierarchical: Option<i32>,
331}