Skip to main content

neon_wasi_http/
query_builder.rs

1use anyhow::{Result, bail};
2use serde::{Deserialize, Serialize, de::DeserializeOwned};
3
4use crate::{Client, QueryResponse};
5
6#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct Query {
8    pub query: String,
9    pub params: Vec<serde_json::Value>,
10}
11
12pub struct QueryBuilder {
13    query: String,
14    params: Vec<serde_json::Value>,
15}
16
17impl QueryBuilder {
18    pub fn new(query: &str) -> Self {
19        Self {
20            query: query.to_string(),
21            params: Vec::new(),
22        }
23    }
24
25    pub fn set_sql(mut self, sql: &str) -> Self {
26        self.query = sql.to_string();
27        self
28    }
29
30    pub fn bind<T: Serialize>(mut self, value: T) -> Self {
31        let val = serde_json::to_value(&value).unwrap();
32        if !val.is_null() {
33            if let serde_json::Value::Object(_) | serde_json::Value::Array(_) = &val {
34                let json_string = serde_json::to_string(&val).unwrap();
35                self.params.push(serde_json::Value::String(json_string));
36            } else {
37                self.params.push(val);
38            }
39        } else {
40            self.params.push(serde_json::Value::Null);
41        }
42
43        self
44    }
45
46    pub fn build(self) -> Query {
47        self.into()
48    }
49
50    pub async fn execute(self, connection: &Client) -> Result<()> {
51        connection.execute(self.build()).await
52    }
53
54    pub async fn execute_raw(self, connection: &Client, is_select: bool) -> Result<QueryResponse> {
55        connection.execute_raw(self.build(), is_select).await
56    }
57
58    pub async fn fetch_one<T>(self, conn: &Client) -> Result<Option<T>>
59    where
60        T: DeserializeOwned,
61    {
62        match self.execute_raw(conn, true).await? {
63            QueryResponse::Ok(mut query_response) => Ok(query_response.deserialize()?),
64            QueryResponse::Err(neon_error) => bail!(neon_error),
65        }
66    }
67
68    pub async fn fetch_all<T>(self, conn: &Client) -> Result<Vec<T>>
69    where
70        T: DeserializeOwned,
71    {
72        match self.execute_raw(conn, true).await? {
73            QueryResponse::Ok(mut query_response) => Ok(query_response.deserialize_multiple()?),
74            QueryResponse::Err(neon_error) => bail!(neon_error),
75        }
76    }
77}
78
79impl From<QueryBuilder> for Query {
80    fn from(value: QueryBuilder) -> Self {
81        Self {
82            query: value.query,
83            params: value.params,
84        }
85    }
86}