dune_api/queries/
api.rs

1//! Queries API implementation
2
3use super::types::*;
4use crate::client::Client;
5use crate::error::{self, Error, Result};
6
7/// Queries API
8pub struct QueriesApi<'a> {
9    client: &'a Client,
10}
11
12impl<'a> QueriesApi<'a> {
13    pub(crate) fn new(client: &'a Client) -> Self {
14        Self { client }
15    }
16
17    /// Create a new query
18    pub async fn create(&self, request: &CreateQueryRequest) -> Result<CreateQueryResponse> {
19        let url = format!("{}/v1/query", self.client.base_url());
20        let response = self.client.http().post(&url).json(request).send().await?;
21
22        if response.status().is_success() {
23            Ok(response.json().await?)
24        } else {
25            let status = response.status().as_u16();
26            let message = response.text().await.unwrap_or_default();
27            Err(Error::api(status, message))
28        }
29    }
30
31    /// Get a query by ID
32    pub async fn get(&self, query_id: i64) -> Result<Query> {
33        let url = format!("{}/v1/query/{}", self.client.base_url(), query_id);
34        let response = self.client.http().get(&url).send().await?;
35
36        if response.status().is_success() {
37            Ok(response.json().await?)
38        } else if response.status() == 404 {
39            Err(error::not_found(format!("Query {}", query_id)))
40        } else {
41            let status = response.status().as_u16();
42            let message = response.text().await.unwrap_or_default();
43            Err(Error::api(status, message))
44        }
45    }
46
47    /// Update a query
48    pub async fn update(
49        &self,
50        query_id: i64,
51        request: &UpdateQueryRequest,
52    ) -> Result<UpdateQueryResponse> {
53        let url = format!("{}/v1/query/{}", self.client.base_url(), query_id);
54        let response = self.client.http().patch(&url).json(request).send().await?;
55
56        if response.status().is_success() {
57            Ok(response.json().await?)
58        } else if response.status() == 404 {
59            Err(error::not_found(format!("Query {}", query_id)))
60        } else {
61            let status = response.status().as_u16();
62            let message = response.text().await.unwrap_or_default();
63            Err(Error::api(status, message))
64        }
65    }
66
67    /// List queries
68    pub async fn list(&self) -> Result<ListQueriesResponse> {
69        self.list_with_options(&ListQueriesOptions::default()).await
70    }
71
72    /// List queries with options
73    pub async fn list_with_options(
74        &self,
75        options: &ListQueriesOptions,
76    ) -> Result<ListQueriesResponse> {
77        let url = format!(
78            "{}/v1/queries{}",
79            self.client.base_url(),
80            options.to_query_string()
81        );
82        let response = self.client.http().get(&url).send().await?;
83
84        if response.status().is_success() {
85            Ok(response.json().await?)
86        } else {
87            let status = response.status().as_u16();
88            let message = response.text().await.unwrap_or_default();
89            Err(Error::api(status, message))
90        }
91    }
92
93    /// Archive a query
94    pub async fn archive(&self, query_id: i64) -> Result<()> {
95        let url = format!("{}/v1/query/{}/archive", self.client.base_url(), query_id);
96        let response = self.client.http().post(&url).send().await?;
97
98        if response.status().is_success() {
99            Ok(())
100        } else if response.status() == 404 {
101            Err(error::not_found(format!("Query {}", query_id)))
102        } else {
103            let status = response.status().as_u16();
104            let message = response.text().await.unwrap_or_default();
105            Err(Error::api(status, message))
106        }
107    }
108
109    /// Unarchive a query
110    pub async fn unarchive(&self, query_id: i64) -> Result<()> {
111        let url = format!("{}/v1/query/{}/unarchive", self.client.base_url(), query_id);
112        let response = self.client.http().post(&url).send().await?;
113
114        if response.status().is_success() {
115            Ok(())
116        } else if response.status() == 404 {
117            Err(error::not_found(format!("Query {}", query_id)))
118        } else {
119            let status = response.status().as_u16();
120            let message = response.text().await.unwrap_or_default();
121            Err(Error::api(status, message))
122        }
123    }
124
125    /// Make a query private
126    pub async fn make_private(&self, query_id: i64) -> Result<()> {
127        let url = format!("{}/v1/query/{}/private", self.client.base_url(), query_id);
128        let response = self.client.http().post(&url).send().await?;
129
130        if response.status().is_success() {
131            Ok(())
132        } else if response.status() == 404 {
133            Err(error::not_found(format!("Query {}", query_id)))
134        } else {
135            let status = response.status().as_u16();
136            let message = response.text().await.unwrap_or_default();
137            Err(Error::api(status, message))
138        }
139    }
140
141    /// Make a query public (unprivate)
142    pub async fn make_public(&self, query_id: i64) -> Result<()> {
143        let url = format!("{}/v1/query/{}/unprivate", self.client.base_url(), query_id);
144        let response = self.client.http().post(&url).send().await?;
145
146        if response.status().is_success() {
147            Ok(())
148        } else if response.status() == 404 {
149            Err(error::not_found(format!("Query {}", query_id)))
150        } else {
151            let status = response.status().as_u16();
152            let message = response.text().await.unwrap_or_default();
153            Err(Error::api(status, message))
154        }
155    }
156}