1use serde::{Deserialize, Serialize};
4
5use super::common::{MinStats, Relation};
6use super::enums::*;
7use super::serde_helpers::{
8 deserialize_optional_f64, deserialize_optional_i32, deserialize_optional_u32,
9 deserialize_optional_vec, deserialize_optional_vec_i32, deserialize_optional_vec_string,
10};
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Geomaterial {
15 pub id: i32,
17 #[serde(default)]
19 pub longid: Option<String>,
20 #[serde(default)]
22 pub guid: Option<String>,
23 pub name: Option<String>,
25 #[serde(default)]
27 pub updttime: Option<String>,
28 #[serde(default)]
30 pub mindat_formula: Option<String>,
31 #[serde(default)]
33 pub mindat_formula_note: Option<String>,
34 #[serde(default)]
36 pub ima_formula: Option<String>,
37 #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
39 pub ima_status: Option<Vec<String>>,
40 #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
42 pub ima_notes: Option<Vec<String>>,
43 #[serde(default, deserialize_with = "deserialize_optional_i32")]
45 pub varietyof: Option<i32>,
46 #[serde(default, deserialize_with = "deserialize_optional_i32")]
48 pub synid: Option<i32>,
49 #[serde(default, deserialize_with = "deserialize_optional_i32")]
51 pub polytypeof: Option<i32>,
52 #[serde(default, deserialize_with = "deserialize_optional_i32")]
54 pub groupid: Option<i32>,
55 #[serde(default, deserialize_with = "deserialize_optional_i32")]
57 pub entrytype: Option<i32>,
58 #[serde(default)]
60 pub entrytype_text: Option<String>,
61 #[serde(default)]
63 pub description_short: Option<String>,
64 #[serde(default)]
66 pub impurities: Option<String>,
67 #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
69 pub elements: Option<Vec<String>>,
70 #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
72 pub sigelements: Option<Vec<String>>,
73 #[serde(default, deserialize_with = "deserialize_optional_vec_string")]
75 pub key_elements: Option<Vec<String>>,
76 #[serde(default)]
78 pub tlform: Option<String>,
79 #[serde(default)]
81 pub cim: Option<String>,
82 #[serde(default)]
84 pub occurrence: Option<String>,
85 #[serde(default)]
87 pub otheroccurrence: Option<String>,
88 #[serde(default)]
90 pub industrial: Option<String>,
91 #[serde(default)]
93 pub discovery_year: Option<String>,
94 #[serde(default, deserialize_with = "deserialize_optional_u32")]
96 pub approval_year: Option<u32>,
97 #[serde(default, deserialize_with = "deserialize_optional_u32")]
99 pub publication_year: Option<u32>,
100 #[serde(default)]
102 pub ima_history: Option<String>,
103 #[serde(default)]
105 pub diapheny: Option<String>,
106 #[serde(default)]
108 pub cleavage: Option<String>,
109 #[serde(default)]
111 pub cleavagetype: Option<String>,
112 #[serde(default)]
114 pub parting: Option<String>,
115 #[serde(default)]
117 pub tenacity: Option<String>,
118 #[serde(default)]
120 pub colour: Option<String>,
121 #[serde(default, deserialize_with = "deserialize_optional_i32")]
123 pub csmetamict: Option<i32>,
124 #[serde(default)]
126 pub opticalextinction: Option<String>,
127 #[serde(default, deserialize_with = "deserialize_optional_f64")]
129 pub hmin: Option<f64>,
130 #[serde(default, deserialize_with = "deserialize_optional_f64")]
132 pub hmax: Option<f64>,
133 #[serde(default, deserialize_with = "deserialize_optional_i32")]
135 pub hardtype: Option<i32>,
136 #[serde(default)]
138 pub vhnmin: Option<String>,
139 #[serde(default)]
141 pub vhnmax: Option<String>,
142 #[serde(default, deserialize_with = "deserialize_optional_i32")]
144 pub vhnerror: Option<i32>,
145 #[serde(default, deserialize_with = "deserialize_optional_i32")]
147 pub vhng: Option<i32>,
148 #[serde(default, deserialize_with = "deserialize_optional_i32")]
150 pub vhns: Option<i32>,
151 #[serde(default)]
153 pub luminescence: Option<String>,
154 #[serde(default)]
156 pub lustre: Option<String>,
157 #[serde(default)]
159 pub lustretype: Option<String>,
160 #[serde(default)]
162 pub aboutname: Option<String>,
163 #[serde(default)]
165 pub other: Option<String>,
166 #[serde(default)]
168 pub streak: Option<String>,
169 #[serde(default)]
171 pub csystem: Option<String>,
172 #[serde(default, deserialize_with = "deserialize_optional_i32")]
174 pub cclass: Option<i32>,
175 #[serde(default, deserialize_with = "deserialize_optional_i32")]
177 pub spacegroup: Option<i32>,
178 #[serde(default)]
180 pub spacegroupset: Option<String>,
181 #[serde(default)]
183 pub a: Option<String>,
184 #[serde(default)]
186 pub b: Option<String>,
187 #[serde(default)]
189 pub c: Option<String>,
190 #[serde(default)]
192 pub alpha: Option<String>,
193 #[serde(default)]
195 pub beta: Option<String>,
196 #[serde(default)]
198 pub gamma: Option<String>,
199 #[serde(default, deserialize_with = "deserialize_optional_f64")]
201 pub va3: Option<f64>,
202 #[serde(default, deserialize_with = "deserialize_optional_i32")]
204 pub z: Option<i32>,
205 #[serde(default)]
207 pub dmeas: Option<String>,
208 #[serde(default)]
210 pub dmeas2: Option<String>,
211 #[serde(default)]
213 pub dcalc: Option<String>,
214 #[serde(default)]
216 pub fracturetype: Option<String>,
217 #[serde(default)]
219 pub morphology: Option<String>,
220 #[serde(default)]
222 pub twinning: Option<String>,
223 #[serde(default)]
225 pub epitaxidescription: Option<String>,
226 #[serde(default)]
228 pub opticaltype: Option<String>,
229 #[serde(default)]
231 pub opticalsign: Option<String>,
232 #[serde(default)]
234 pub opticalalpha: Option<String>,
235 #[serde(default)]
237 pub opticalbeta: Option<String>,
238 #[serde(default)]
240 pub opticalgamma: Option<String>,
241 #[serde(default)]
243 pub opticalomega: Option<String>,
244 #[serde(default)]
246 pub opticalepsilon: Option<String>,
247 #[serde(default)]
249 pub opticaln: Option<String>,
250 #[serde(default)]
252 pub optical2vcalc: Option<String>,
253 #[serde(default)]
255 pub optical2vmeasured: Option<String>,
256 #[serde(default)]
258 pub opticaldispersion: Option<String>,
259 #[serde(default)]
261 pub opticalpleochroism: Option<String>,
262 #[serde(default)]
264 pub opticalpleochorismdesc: Option<String>,
265 #[serde(default)]
267 pub opticalbirefringence: Option<String>,
268 #[serde(default)]
270 pub opticalcomments: Option<String>,
271 #[serde(default)]
273 pub opticalcolour: Option<String>,
274 #[serde(default)]
276 pub opticalinternal: Option<String>,
277 #[serde(default)]
279 pub opticaltropic: Option<String>,
280 #[serde(default)]
282 pub opticalanisotropism: Option<String>,
283 #[serde(default)]
285 pub opticalbireflectance: Option<String>,
286 #[serde(default)]
288 pub opticalr: Option<String>,
289 #[serde(default, deserialize_with = "deserialize_optional_f64")]
291 pub rimin: Option<f64>,
292 #[serde(default, deserialize_with = "deserialize_optional_f64")]
294 pub rimax: Option<f64>,
295 #[serde(default)]
297 pub uv: Option<String>,
298 #[serde(default)]
300 pub ir: Option<String>,
301 #[serde(default)]
303 pub magnetism: Option<String>,
304 #[serde(default)]
306 pub type_specimen_store: Option<String>,
307 #[serde(default)]
309 pub shortcode_ima: Option<String>,
310 #[serde(default)]
312 pub strunz10ed1: Option<String>,
313 #[serde(default)]
314 pub strunz10ed2: Option<String>,
315 #[serde(default)]
316 pub strunz10ed3: Option<String>,
317 #[serde(default)]
318 pub strunz10ed4: Option<String>,
319 #[serde(default)]
321 pub dana8ed1: Option<String>,
322 #[serde(default)]
323 pub dana8ed2: Option<String>,
324 #[serde(default)]
325 pub dana8ed3: Option<String>,
326 #[serde(default)]
327 pub dana8ed4: Option<String>,
328 #[serde(default)]
330 pub thermalbehaviour: Option<String>,
331 #[serde(default)]
333 pub electrical: Option<String>,
334 #[serde(default, deserialize_with = "deserialize_optional_i32")]
336 pub rock_parent: Option<i32>,
337 #[serde(default, deserialize_with = "deserialize_optional_i32")]
339 pub rock_parent2: Option<i32>,
340 #[serde(default, deserialize_with = "deserialize_optional_i32")]
342 pub rock_root: Option<i32>,
343 #[serde(default)]
345 pub rock_bgs_code: Option<String>,
346 #[serde(default)]
348 pub meteoritical_code: Option<String>,
349 #[serde(default, deserialize_with = "deserialize_optional_i32")]
351 pub weighting: Option<i32>,
352 #[serde(default, deserialize_with = "deserialize_optional_vec")]
354 pub relations: Option<Vec<Relation>>,
355 #[serde(default)]
357 pub minstats: Option<MinStats>,
358 #[serde(default, deserialize_with = "deserialize_optional_vec_i32")]
360 pub locality: Option<Vec<i32>>,
361 #[serde(default, deserialize_with = "deserialize_optional_vec_i32")]
363 pub type_localities: Option<Vec<i32>>,
364}
365
366#[derive(Debug, Clone, Default)]
368pub struct GeomaterialsQuery {
369 pub name: Option<String>,
371 pub q: Option<String>,
373 pub ima: Option<bool>,
375 pub ima_status: Option<Vec<ImaStatus>>,
377 pub ima_notes: Option<Vec<ImaNotes>>,
379 pub entrytype: Option<Vec<u8>>,
381 pub elements_inc: Option<String>,
383 pub elements_exc: Option<String>,
385 pub crystal_system: Option<Vec<CrystalSystem>>,
387 pub cleavagetype: Option<Vec<CleavageType>>,
389 pub fracturetype: Option<Vec<FractureType>>,
391 pub lustretype: Option<Vec<LustreType>>,
393 pub diapheny: Option<Vec<Diapheny>>,
395 pub tenacity: Option<Vec<Tenacity>>,
397 pub colour: Option<String>,
399 pub streak: Option<String>,
401 pub opticaltype: Option<OpticalType>,
403 pub opticalsign: Option<OpticalSign>,
405 pub hardness_min: Option<f32>,
407 pub hardness_max: Option<f32>,
409 pub density_min: Option<f64>,
411 pub density_max: Option<f64>,
413 pub ri_min: Option<f32>,
415 pub ri_max: Option<f32>,
417 pub bi_min: Option<String>,
419 pub bi_max: Option<String>,
421 pub optical2v_min: Option<String>,
423 pub optical2v_max: Option<String>,
425 pub varietyof: Option<i32>,
427 pub synid: Option<i32>,
429 pub polytypeof: Option<i32>,
431 pub groupid: Option<i32>,
433 pub id_in: Option<Vec<i32>>,
435 pub non_utf: Option<bool>,
437 pub meteoritical_code: Option<String>,
439 pub meteoritical_code_exists: Option<bool>,
441 pub updated_at: Option<String>,
443 pub fields: Option<String>,
445 pub omit: Option<String>,
447 pub expand: Option<Vec<String>>,
449 pub ordering: Option<GeomaterialsOrdering>,
451 pub page: Option<i32>,
453 pub page_size: Option<i32>,
455}
456
457impl GeomaterialsQuery {
458 pub fn new() -> Self {
460 Self::default()
461 }
462
463 pub fn name(mut self, name: impl Into<String>) -> Self {
465 self.name = Some(name.into());
466 self
467 }
468
469 pub fn search(mut self, q: impl Into<String>) -> Self {
471 self.q = Some(q.into());
472 self
473 }
474
475 pub fn ima_approved(mut self, approved: bool) -> Self {
477 self.ima = Some(approved);
478 self
479 }
480
481 pub fn entry_types(mut self, types: Vec<u8>) -> Self {
483 self.entrytype = Some(types);
484 self
485 }
486
487 pub fn with_elements(mut self, elements: impl Into<String>) -> Self {
489 self.elements_inc = Some(elements.into());
490 self
491 }
492
493 pub fn without_elements(mut self, elements: impl Into<String>) -> Self {
495 self.elements_exc = Some(elements.into());
496 self
497 }
498
499 pub fn crystal_systems(mut self, systems: Vec<CrystalSystem>) -> Self {
501 self.crystal_system = Some(systems);
502 self
503 }
504
505 pub fn hardness_range(mut self, min: f32, max: f32) -> Self {
507 self.hardness_min = Some(min);
508 self.hardness_max = Some(max);
509 self
510 }
511
512 pub fn density_range(mut self, min: f64, max: f64) -> Self {
514 self.density_min = Some(min);
515 self.density_max = Some(max);
516 self
517 }
518
519 pub fn select_fields(mut self, fields: impl Into<String>) -> Self {
521 self.fields = Some(fields.into());
522 self
523 }
524
525 pub fn omit_fields(mut self, fields: impl Into<String>) -> Self {
527 self.omit = Some(fields.into());
528 self
529 }
530
531 pub fn expand_fields(mut self, fields: Vec<String>) -> Self {
533 self.expand = Some(fields);
534 self
535 }
536
537 pub fn order_by(mut self, ordering: GeomaterialsOrdering) -> Self {
539 self.ordering = Some(ordering);
540 self
541 }
542
543 pub fn page(mut self, page: i32) -> Self {
545 self.page = Some(page);
546 self
547 }
548
549 pub fn page_size(mut self, size: i32) -> Self {
551 self.page_size = Some(size);
552 self
553 }
554}