use serde::{Deserialize, Serialize};
use super::serde_helpers::{deserialize_optional_vec_i32, deserialize_optional_vec_string};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImaMaterial {
pub id: i32,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub ima_formula: Option<String>,
#[serde(default)]
pub ima_symbol: Option<String>,
#[serde(default)]
pub ima_year: Option<String>,
#[serde(default)]
pub discovery_year: Option<String>,
#[serde(default, deserialize_with = "deserialize_optional_vec_string")]
pub ima_status: Option<Vec<String>>,
#[serde(default, deserialize_with = "deserialize_optional_vec_string")]
pub ima_notes: Option<Vec<String>>,
#[serde(default)]
pub type_specimen_store: Option<String>,
#[serde(default)]
pub mindat_longid: Option<String>,
#[serde(default)]
pub mindat_guid: Option<String>,
#[serde(default, deserialize_with = "deserialize_optional_vec_i32")]
pub type_localities: Option<Vec<i32>>,
#[serde(default)]
pub description_short: Option<String>,
#[serde(default)]
pub mindat_formula: Option<String>,
#[serde(default)]
pub mindat_formula_note: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ImaMineralsQuery {
pub q: Option<String>,
pub name: Option<String>,
pub ima: Option<i32>,
pub elements_inc: Option<String>,
pub elements_exc: Option<String>,
pub el_essential: Option<String>,
pub colour: Option<String>,
pub streak: Option<String>,
pub hardness_min: Option<f32>,
pub hardness_max: Option<f32>,
pub density_min: Option<f64>,
pub density_max: Option<f64>,
pub ri_min: Option<f32>,
pub ri_max: Option<f32>,
pub varietyof: Option<i32>,
pub synid: Option<i32>,
pub polytypeof: Option<i32>,
pub groupid: Option<i32>,
pub meteoritical_code: Option<String>,
pub meteoritical_code_exists: Option<bool>,
pub non_utf: Option<bool>,
pub id_in: Option<Vec<i32>>,
pub id_min: Option<i32>,
pub id_max: Option<i32>,
pub updated_at: Option<String>,
pub fields: Option<String>,
pub omit: Option<String>,
pub expand: Option<Vec<String>>,
pub page: Option<i32>,
pub page_size: Option<i32>,
}
impl ImaMineralsQuery {
pub fn new() -> Self {
Self::default()
}
pub fn search(mut self, q: impl Into<String>) -> Self {
self.q = Some(q.into());
self
}
pub fn name(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
pub fn with_elements(mut self, elements: impl Into<String>) -> Self {
self.elements_inc = Some(elements.into());
self
}
pub fn without_elements(mut self, elements: impl Into<String>) -> Self {
self.elements_exc = Some(elements.into());
self
}
pub fn essential_elements(mut self, elements: impl Into<String>) -> Self {
self.el_essential = Some(elements.into());
self
}
pub fn hardness_range(mut self, min: f32, max: f32) -> Self {
self.hardness_min = Some(min);
self.hardness_max = Some(max);
self
}
pub fn density_range(mut self, min: f64, max: f64) -> Self {
self.density_min = Some(min);
self.density_max = Some(max);
self
}
pub fn ids(mut self, ids: Vec<i32>) -> Self {
self.id_in = Some(ids);
self
}
pub fn select_fields(mut self, fields: impl Into<String>) -> Self {
self.fields = Some(fields.into());
self
}
pub fn omit_fields(mut self, fields: impl Into<String>) -> Self {
self.omit = Some(fields.into());
self
}
pub fn expand_fields(mut self, fields: Vec<String>) -> Self {
self.expand = Some(fields);
self
}
pub fn page(mut self, page: i32) -> Self {
self.page = Some(page);
self
}
pub fn page_size(mut self, size: i32) -> Self {
self.page_size = Some(size);
self
}
}