dune_api/queries/
types.rs

1//! Types for the Queries API
2
3use serde::{Deserialize, Serialize};
4
5/// Query parameter definition
6#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct Parameter {
8    /// Parameter key/name
9    pub key: String,
10    /// Parameter type (text, number, date, enum, etc.)
11    #[serde(rename = "type")]
12    pub param_type: Option<String>,
13    /// Default value
14    pub value: Option<String>,
15    /// Multiple values (for multiselect)
16    #[serde(default)]
17    pub values: Vec<String>,
18    /// Description
19    pub description: Option<String>,
20    /// Enum options
21    #[serde(default, rename = "enumOptions")]
22    pub enum_options: Vec<String>,
23    /// Allow freeform input for enum
24    #[serde(rename = "isFreeformAllowed")]
25    pub is_freeform_allowed: Option<bool>,
26    /// Allow multiple selections
27    #[serde(rename = "isMultiselect")]
28    pub is_multiselect: Option<bool>,
29}
30
31/// Query response from get/create operations
32#[derive(Debug, Clone, Deserialize, Serialize)]
33pub struct Query {
34    /// Unique query ID
35    pub query_id: i64,
36    /// Query name
37    pub name: String,
38    /// Query description
39    pub description: Option<String>,
40    /// SQL query text
41    pub query_sql: Option<String>,
42    /// Query parameters
43    #[serde(default)]
44    pub parameters: Vec<Parameter>,
45    /// Query owner (username or team handle)
46    pub owner: Option<String>,
47    /// Whether the query is private
48    pub is_private: Option<bool>,
49    /// Whether the query is archived
50    pub is_archived: Option<bool>,
51    /// Whether the query is unsaved
52    pub is_unsaved: Option<bool>,
53    /// Query engine (medium, large)
54    pub query_engine: Option<String>,
55    /// Query version
56    pub version: Option<i64>,
57    /// Tags
58    #[serde(default)]
59    pub tags: Vec<String>,
60}
61
62/// Response from create query
63#[derive(Debug, Clone, Deserialize, Serialize)]
64pub struct CreateQueryResponse {
65    /// Created query ID
66    pub query_id: i64,
67}
68
69/// Response from update query
70#[derive(Debug, Clone, Deserialize, Serialize)]
71pub struct UpdateQueryResponse {
72    /// Updated query ID
73    pub query_id: i64,
74}
75
76/// Request to create a query
77#[derive(Debug, Clone, Serialize)]
78pub struct CreateQueryRequest {
79    /// Query name
80    pub name: String,
81    /// SQL query text
82    pub query_sql: String,
83    /// Query description
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub description: Option<String>,
86    /// Query parameters
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub parameters: Option<Vec<Parameter>>,
89    /// Whether the query is private
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub is_private: Option<bool>,
92    /// Tags
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub tags: Option<Vec<String>>,
95}
96
97impl CreateQueryRequest {
98    /// Create a new query request
99    pub fn new(name: &str, query_sql: &str) -> Self {
100        Self {
101            name: name.to_string(),
102            query_sql: query_sql.to_string(),
103            description: None,
104            parameters: None,
105            is_private: None,
106            tags: None,
107        }
108    }
109
110    /// Set the description
111    pub fn description(mut self, description: &str) -> Self {
112        self.description = Some(description.to_string());
113        self
114    }
115
116    /// Set as private
117    pub fn private(mut self, is_private: bool) -> Self {
118        self.is_private = Some(is_private);
119        self
120    }
121
122    /// Set tags
123    pub fn tags(mut self, tags: Vec<String>) -> Self {
124        self.tags = Some(tags);
125        self
126    }
127}
128
129/// Request to update a query
130#[derive(Debug, Clone, Serialize, Default)]
131pub struct UpdateQueryRequest {
132    /// Query name
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub name: Option<String>,
135    /// SQL query text
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub query_sql: Option<String>,
138    /// Query description
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub description: Option<String>,
141    /// Query parameters
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub parameters: Option<Vec<Parameter>>,
144    /// Tags
145    #[serde(skip_serializing_if = "Option::is_none")]
146    pub tags: Option<Vec<String>>,
147}
148
149/// Response from list queries
150#[derive(Debug, Clone, Deserialize, Serialize)]
151pub struct ListQueriesResponse {
152    /// List of queries
153    pub queries: Vec<Query>,
154    /// Next page offset
155    pub next_offset: Option<i64>,
156}
157
158/// Query list options
159#[derive(Debug, Clone, Default)]
160pub struct ListQueriesOptions {
161    /// Maximum number of results
162    pub limit: Option<u32>,
163    /// Pagination offset
164    pub offset: Option<i64>,
165}
166
167impl ListQueriesOptions {
168    pub fn to_query_string(&self) -> String {
169        let mut params = Vec::new();
170        if let Some(limit) = self.limit {
171            params.push(format!("limit={}", limit));
172        }
173        if let Some(offset) = self.offset {
174            params.push(format!("offset={}", offset));
175        }
176        if params.is_empty() {
177            String::new()
178        } else {
179            format!("?{}", params.join("&"))
180        }
181    }
182}