1use super::types::*;
4use crate::client::Client;
5use crate::error::{self, Error, Result};
6
7pub struct MatviewsApi<'a> {
9 client: &'a Client,
10}
11
12impl<'a> MatviewsApi<'a> {
13 pub(crate) fn new(client: &'a Client) -> Self {
14 Self { client }
15 }
16
17 pub async fn upsert(&self, request: &UpsertMatviewRequest) -> Result<UpsertMatviewResponse> {
19 let url = format!("{}/v1/materialized-views", 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 pub async fn get(&self, name: &str) -> Result<Matview> {
33 let url = format!("{}/v1/materialized-views/{}", self.client.base_url(), name);
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!("Matview {}", name)))
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 pub async fn list(&self) -> Result<ListMatviewsResponse> {
49 self.list_with_options(&ListMatviewsOptions::default())
50 .await
51 }
52
53 pub async fn list_with_options(
55 &self,
56 options: &ListMatviewsOptions,
57 ) -> Result<ListMatviewsResponse> {
58 let url = format!(
59 "{}/v1/materialized-views{}",
60 self.client.base_url(),
61 options.to_query_string()
62 );
63 let response = self.client.http().get(&url).send().await?;
64
65 if response.status().is_success() {
66 Ok(response.json().await?)
67 } else {
68 let status = response.status().as_u16();
69 let message = response.text().await.unwrap_or_default();
70 Err(Error::api(status, message))
71 }
72 }
73
74 pub async fn refresh(&self, name: &str) -> Result<RefreshMatviewResponse> {
76 self.refresh_with_options(name, &RefreshMatviewRequest::default())
77 .await
78 }
79
80 pub async fn refresh_with_options(
82 &self,
83 name: &str,
84 request: &RefreshMatviewRequest,
85 ) -> Result<RefreshMatviewResponse> {
86 let url = format!(
87 "{}/v1/materialized-views/{}/refresh",
88 self.client.base_url(),
89 name
90 );
91 let response = self.client.http().post(&url).json(request).send().await?;
92
93 if response.status().is_success() {
94 Ok(response.json().await?)
95 } else if response.status() == 404 {
96 Err(error::not_found(format!("Matview {}", name)))
97 } else {
98 let status = response.status().as_u16();
99 let message = response.text().await.unwrap_or_default();
100 Err(Error::api(status, message))
101 }
102 }
103
104 pub async fn delete(&self, name: &str) -> Result<DeleteMatviewResponse> {
106 let url = format!("{}/v1/materialized-views/{}", self.client.base_url(), name);
107 let response = self.client.http().delete(&url).send().await?;
108
109 if response.status().is_success() {
110 Ok(response.json().await?)
111 } else if response.status() == 404 {
112 Err(error::not_found(format!("Matview {}", name)))
113 } else {
114 let status = response.status().as_u16();
115 let message = response.text().await.unwrap_or_default();
116 Err(Error::api(status, message))
117 }
118 }
119}