dune_api/queries/
types.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct Parameter {
8 pub key: String,
10 #[serde(rename = "type")]
12 pub param_type: Option<String>,
13 pub value: Option<String>,
15 #[serde(default)]
17 pub values: Vec<String>,
18 pub description: Option<String>,
20 #[serde(default, rename = "enumOptions")]
22 pub enum_options: Vec<String>,
23 #[serde(rename = "isFreeformAllowed")]
25 pub is_freeform_allowed: Option<bool>,
26 #[serde(rename = "isMultiselect")]
28 pub is_multiselect: Option<bool>,
29}
30
31#[derive(Debug, Clone, Deserialize, Serialize)]
33pub struct Query {
34 pub query_id: i64,
36 pub name: String,
38 pub description: Option<String>,
40 pub query_sql: Option<String>,
42 #[serde(default)]
44 pub parameters: Vec<Parameter>,
45 pub owner: Option<String>,
47 pub is_private: Option<bool>,
49 pub is_archived: Option<bool>,
51 pub is_unsaved: Option<bool>,
53 pub query_engine: Option<String>,
55 pub version: Option<i64>,
57 #[serde(default)]
59 pub tags: Vec<String>,
60}
61
62#[derive(Debug, Clone, Deserialize, Serialize)]
64pub struct CreateQueryResponse {
65 pub query_id: i64,
67}
68
69#[derive(Debug, Clone, Deserialize, Serialize)]
71pub struct UpdateQueryResponse {
72 pub query_id: i64,
74}
75
76#[derive(Debug, Clone, Serialize)]
78pub struct CreateQueryRequest {
79 pub name: String,
81 pub query_sql: String,
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub description: Option<String>,
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub parameters: Option<Vec<Parameter>>,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub is_private: Option<bool>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub tags: Option<Vec<String>>,
95}
96
97impl CreateQueryRequest {
98 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 pub fn description(mut self, description: &str) -> Self {
112 self.description = Some(description.to_string());
113 self
114 }
115
116 pub fn private(mut self, is_private: bool) -> Self {
118 self.is_private = Some(is_private);
119 self
120 }
121
122 pub fn tags(mut self, tags: Vec<String>) -> Self {
124 self.tags = Some(tags);
125 self
126 }
127}
128
129#[derive(Debug, Clone, Serialize, Default)]
131pub struct UpdateQueryRequest {
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub name: Option<String>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub query_sql: Option<String>,
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub description: Option<String>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub parameters: Option<Vec<Parameter>>,
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub tags: Option<Vec<String>>,
147}
148
149#[derive(Debug, Clone, Deserialize, Serialize)]
151pub struct ListQueriesResponse {
152 pub queries: Vec<Query>,
154 pub next_offset: Option<i64>,
156}
157
158#[derive(Debug, Clone, Default)]
160pub struct ListQueriesOptions {
161 pub limit: Option<u32>,
163 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}