Skip to main content

mindat_rs/models/
relations.rs

1//! Mineral relation types for the Mindat API (`/relations/`).
2
3use serde::{Deserialize, Serialize};
4
5use super::serde_helpers::{deserialize_i64, deserialize_optional_i64};
6
7/// A relation between two minerals (`/relations/`).
8///
9/// Not to be confused with [`crate::Relation`], which is the embedded relation
10/// object returned inside a geomaterial record.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct MineralRelation {
13    /// Relation ID.
14    #[serde(deserialize_with = "deserialize_i64")]
15    pub rid: i64,
16    /// First mineral (geomaterial) ID.
17    #[serde(default, deserialize_with = "deserialize_optional_i64")]
18    pub min1: Option<i64>,
19    /// Second mineral (geomaterial) ID.
20    #[serde(default, deserialize_with = "deserialize_optional_i64")]
21    pub min2: Option<i64>,
22    /// Relation type.
23    #[serde(default)]
24    pub rel: Option<serde_json::Value>,
25}
26
27/// Builder for `/relations/` query parameters.
28#[derive(Debug, Clone, Default)]
29pub struct RelationsQuery {
30    /// Free-text search.
31    pub q: Option<String>,
32    /// Filter by first mineral ID.
33    pub min1: Option<i64>,
34    /// Filter by second mineral ID.
35    pub min2: Option<i64>,
36    /// Filter by relation type.
37    pub rel: Option<i32>,
38    /// Page number.
39    pub page: Option<i32>,
40    /// Page size.
41    pub page_size: Option<i32>,
42}
43
44impl RelationsQuery {
45    /// Create a new empty query.
46    pub fn new() -> Self {
47        Self::default()
48    }
49
50    /// Filter to relations involving a given mineral (as `min1`).
51    pub fn mineral(mut self, mineral_id: i64) -> Self {
52        self.min1 = Some(mineral_id);
53        self
54    }
55
56    /// Set page number.
57    pub fn page(mut self, page: i32) -> Self {
58        self.page = Some(page);
59        self
60    }
61
62    /// Set page size.
63    pub fn page_size(mut self, size: i32) -> Self {
64        self.page_size = Some(size);
65        self
66    }
67}